From d776fda6935bc3a89c200d0aa7509d4ad5d6b377 Mon Sep 17 00:00:00 2001 From: MaMilaCan Date: Mon, 7 Oct 2019 21:08:17 +0200 Subject: [PATCH 1/3] first step - not buildable!!! i neeed to change soemthing big and want to have it saved first. --- tabler.Logic/Classes/ItemSelected.cs | 16 + tabler.Logic/Classes/Key.cs | 274 ++++- tabler.Logic/Classes/Package.cs | 8 + tabler.Logic/Classes/Project.cs | 8 + tabler.Logic/Classes/Settings.cs | 10 +- tabler.Logic/Enums/LogTypeEnum.cs | 9 + tabler.Logic/Extensions/ExtensionMethods.cs | 13 + tabler.Logic/Helper/ConfigHelper.cs | 199 +--- tabler.Logic/Helper/Logger.cs | 66 ++ tabler.Logic/Helper/StringtableHelper.cs | 159 ++- tabler.Logic/Helper/TranslationHelper.cs | 68 +- tabler.Logic/packages.config | 1 + tabler.Logic/tabler.Logic.csproj | 9 + tabler.sln | 10 +- tabler.wpf/App.config | 6 + .../Key_ExtendedWithChangeTracking.cs | 184 +++ tabler.wpf/Container/VersionInfoContainer.cs | 33 + tabler.wpf/Controls/General_VersionInfo.xaml | 33 + .../Controls/General_VersionInfo.xaml.cs | 87 ++ .../Controls/Helper_DataGridExtended.cs | 119 ++ tabler.wpf/Controls/Helper_LabelTextBox.xaml | 28 + .../Controls/Helper_LabelTextBox.xaml.cs | 128 +++ tabler.wpf/Controls/Helper_LogMessages.xaml | 39 + .../Controls/Helper_LogMessages.xaml.cs | 176 +++ tabler.wpf/Controls/Helper_ProgressBar.xaml | 30 + .../Controls/Helper_ProgressBar.xaml.cs | 277 +++++ .../Controls/Helper_TabControlExtended.cs | 35 + tabler.wpf/Controls/Helper_TabItemExtended.cs | 18 + tabler.wpf/Controls/ItemSelectControl.xaml | 31 + tabler.wpf/Controls/ItemSelectControl.xaml.cs | 41 + tabler.wpf/Controls/LogMessages_Window.xaml | 20 + .../Controls/LogMessages_Window.xaml.cs | 30 + .../TranslationFileOverviewControl.xaml | 38 + .../TranslationFileOverviewControl.xaml.cs | 69 ++ .../TranslationFileSingleControl.xaml | 143 +++ .../TranslationFileSingleControl.xaml.cs | 429 +++++++ tabler.wpf/ExampleData/proj1/stringtable.xml | 219 ++++ tabler.wpf/ExampleData/proj2/stringtable.xml | 219 ++++ tabler.wpf/Helper/ClipBoardHelper.cs | 89 ++ tabler.wpf/Helper/Converter/BoolInverter.cs | 34 + .../BooleanNullableToBrushConverter.cs | 96 ++ .../Converter/BooleanToVisibilityConverter.cs | 62 + .../Helper/Converter/CompleteConverter.cs | 32 + .../Helper/Converter/DateTimeDateConverter.cs | 33 + .../Helper/Converter/DateToStringConverter.cs | 46 + .../DoubleToStringConverterNoScientific.cs | 54 + .../Helper/Converter/IsNullConverter.cs | 37 + .../Converter/NegativeNumberToRedConverter.cs | 72 ++ .../Converter/StringToNumberConverter.cs | 67 ++ .../Helper/Converter/ValueToBrushConverter.cs | 79 ++ .../Converter/VisibilityToBooleanConverter.cs | 37 + tabler.wpf/Helper/ExtensionMethods.cs | 624 ++++++++++ tabler.wpf/Helper/IProgressBarControl.cs | 18 + tabler.wpf/Helper/ProgressLogger.cs | 86 ++ tabler.wpf/Helper/ProgressLoggerControl.cs | 72 ++ tabler.wpf/Helper/ProgressLoggerForEach.cs | 160 +++ tabler.wpf/Helper/PropertyComparer.cs | 49 + tabler.wpf/Helper/SearchLogFilesHelper.cs | 87 ++ tabler.wpf/Helper/SortableBindingList.cs | 110 ++ tabler.wpf/Helper/StopWatch.cs | 100 ++ tabler.wpf/Helper/TranslationHelper.cs | 26 + tabler.wpf/Images/Icon-16.png | Bin 0 -> 1205 bytes tabler.wpf/Images/Icon-16.psd | Bin 0 -> 61392 bytes tabler.wpf/Images/Icon-256.png | Bin 0 -> 6128 bytes tabler.wpf/Images/Icon-256.psd | Bin 0 -> 110473 bytes tabler.wpf/Images/Icon-32.png | Bin 0 -> 1489 bytes tabler.wpf/Images/Icon-32.psd | Bin 0 -> 61935 bytes tabler.wpf/Images/Icon-48.png | Bin 0 -> 2047 bytes tabler.wpf/Images/Icon-48.psd | Bin 0 -> 66964 bytes tabler.wpf/Properties/AssemblyInfo.cs | 55 + tabler.wpf/Properties/Resources.Designer.cs | 244 ++++ tabler.wpf/Properties/Resources.de-DE.resx | 187 +++ tabler.wpf/Properties/Resources.resx | 188 +++ tabler.wpf/Properties/Resources.ru-RU.resx | 88 ++ tabler.wpf/Properties/Settings.Designer.cs | 30 + tabler.wpf/Properties/Settings.settings | 7 + tabler.wpf/Windows/App.xaml | 9 + tabler.wpf/Windows/App.xaml.cs | 17 + tabler.wpf/Windows/MainWindow.xaml | 69 ++ tabler.wpf/Windows/MainWindow.xaml.cs | 179 +++ tabler.wpf/WpfBinding.pdf | Bin 0 -> 311623 bytes tabler.wpf/packages.config | 8 + tabler.wpf/tabler.wpf.csproj | 231 ++++ tabler.wpf/xaml_codehelper.xml | 11 + tabler/Classes/Logger.cs | 53 - tabler/Forms/GridUI.cs | 22 +- tabler/Forms/SettingsForm.cs | 24 +- tabler/data/stringtable.xml | 1021 ++++------------- tabler/tabler.csproj | 1 - 89 files changed, 6664 insertions(+), 1132 deletions(-) create mode 100644 tabler.Logic/Classes/ItemSelected.cs create mode 100644 tabler.Logic/Enums/LogTypeEnum.cs create mode 100644 tabler.Logic/Extensions/ExtensionMethods.cs create mode 100644 tabler.Logic/Helper/Logger.cs create mode 100644 tabler.wpf/App.config create mode 100644 tabler.wpf/Container/Key_ExtendedWithChangeTracking.cs create mode 100644 tabler.wpf/Container/VersionInfoContainer.cs create mode 100644 tabler.wpf/Controls/General_VersionInfo.xaml create mode 100644 tabler.wpf/Controls/General_VersionInfo.xaml.cs create mode 100644 tabler.wpf/Controls/Helper_DataGridExtended.cs create mode 100644 tabler.wpf/Controls/Helper_LabelTextBox.xaml create mode 100644 tabler.wpf/Controls/Helper_LabelTextBox.xaml.cs create mode 100644 tabler.wpf/Controls/Helper_LogMessages.xaml create mode 100644 tabler.wpf/Controls/Helper_LogMessages.xaml.cs create mode 100644 tabler.wpf/Controls/Helper_ProgressBar.xaml create mode 100644 tabler.wpf/Controls/Helper_ProgressBar.xaml.cs create mode 100644 tabler.wpf/Controls/Helper_TabControlExtended.cs create mode 100644 tabler.wpf/Controls/Helper_TabItemExtended.cs create mode 100644 tabler.wpf/Controls/ItemSelectControl.xaml create mode 100644 tabler.wpf/Controls/ItemSelectControl.xaml.cs create mode 100644 tabler.wpf/Controls/LogMessages_Window.xaml create mode 100644 tabler.wpf/Controls/LogMessages_Window.xaml.cs create mode 100644 tabler.wpf/Controls/TranslationFileOverviewControl.xaml create mode 100644 tabler.wpf/Controls/TranslationFileOverviewControl.xaml.cs create mode 100644 tabler.wpf/Controls/TranslationFileSingleControl.xaml create mode 100644 tabler.wpf/Controls/TranslationFileSingleControl.xaml.cs create mode 100644 tabler.wpf/ExampleData/proj1/stringtable.xml create mode 100644 tabler.wpf/ExampleData/proj2/stringtable.xml create mode 100644 tabler.wpf/Helper/ClipBoardHelper.cs create mode 100644 tabler.wpf/Helper/Converter/BoolInverter.cs create mode 100644 tabler.wpf/Helper/Converter/BooleanNullableToBrushConverter.cs create mode 100644 tabler.wpf/Helper/Converter/BooleanToVisibilityConverter.cs create mode 100644 tabler.wpf/Helper/Converter/CompleteConverter.cs create mode 100644 tabler.wpf/Helper/Converter/DateTimeDateConverter.cs create mode 100644 tabler.wpf/Helper/Converter/DateToStringConverter.cs create mode 100644 tabler.wpf/Helper/Converter/DoubleToStringConverterNoScientific.cs create mode 100644 tabler.wpf/Helper/Converter/IsNullConverter.cs create mode 100644 tabler.wpf/Helper/Converter/NegativeNumberToRedConverter.cs create mode 100644 tabler.wpf/Helper/Converter/StringToNumberConverter.cs create mode 100644 tabler.wpf/Helper/Converter/ValueToBrushConverter.cs create mode 100644 tabler.wpf/Helper/Converter/VisibilityToBooleanConverter.cs create mode 100644 tabler.wpf/Helper/ExtensionMethods.cs create mode 100644 tabler.wpf/Helper/IProgressBarControl.cs create mode 100644 tabler.wpf/Helper/ProgressLogger.cs create mode 100644 tabler.wpf/Helper/ProgressLoggerControl.cs create mode 100644 tabler.wpf/Helper/ProgressLoggerForEach.cs create mode 100644 tabler.wpf/Helper/PropertyComparer.cs create mode 100644 tabler.wpf/Helper/SearchLogFilesHelper.cs create mode 100644 tabler.wpf/Helper/SortableBindingList.cs create mode 100644 tabler.wpf/Helper/StopWatch.cs create mode 100644 tabler.wpf/Helper/TranslationHelper.cs create mode 100644 tabler.wpf/Images/Icon-16.png create mode 100644 tabler.wpf/Images/Icon-16.psd create mode 100644 tabler.wpf/Images/Icon-256.png create mode 100644 tabler.wpf/Images/Icon-256.psd create mode 100644 tabler.wpf/Images/Icon-32.png create mode 100644 tabler.wpf/Images/Icon-32.psd create mode 100644 tabler.wpf/Images/Icon-48.png create mode 100644 tabler.wpf/Images/Icon-48.psd create mode 100644 tabler.wpf/Properties/AssemblyInfo.cs create mode 100644 tabler.wpf/Properties/Resources.Designer.cs create mode 100644 tabler.wpf/Properties/Resources.de-DE.resx create mode 100644 tabler.wpf/Properties/Resources.resx create mode 100644 tabler.wpf/Properties/Resources.ru-RU.resx create mode 100644 tabler.wpf/Properties/Settings.Designer.cs create mode 100644 tabler.wpf/Properties/Settings.settings create mode 100644 tabler.wpf/Windows/App.xaml create mode 100644 tabler.wpf/Windows/App.xaml.cs create mode 100644 tabler.wpf/Windows/MainWindow.xaml create mode 100644 tabler.wpf/Windows/MainWindow.xaml.cs create mode 100644 tabler.wpf/WpfBinding.pdf create mode 100644 tabler.wpf/packages.config create mode 100644 tabler.wpf/tabler.wpf.csproj create mode 100644 tabler.wpf/xaml_codehelper.xml delete mode 100644 tabler/Classes/Logger.cs diff --git a/tabler.Logic/Classes/ItemSelected.cs b/tabler.Logic/Classes/ItemSelected.cs new file mode 100644 index 0000000..0e714d7 --- /dev/null +++ b/tabler.Logic/Classes/ItemSelected.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace tabler.Logic.Classes +{ + public class ItemSelected + { + public bool IsSelected { get; set; } + public string DisplayName { get; set; } + public string Key { get; set; } + + } +} diff --git a/tabler.Logic/Classes/Key.cs b/tabler.Logic/Classes/Key.cs index 0913f6b..cf2f36b 100644 --- a/tabler.Logic/Classes/Key.cs +++ b/tabler.Logic/Classes/Key.cs @@ -1,41 +1,309 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.Serialization; +using System.Windows.Media; +using System.Xml.Linq; using System.Xml.Serialization; +using tabler.Logic.Extensions; -namespace tabler.Logic.Classes { - public class Key { - +namespace tabler.Logic.Classes +{ + [DataContract] + [Serializable] //for copy paste action + public class Key + { + [DataMember] [XmlAttribute("ID")] public string Id { get; set; } + [DataMember] public string Original { get; set; } + [DataMember] public string English { get; set; } + [DataMember] public string German { get; set; } + [DataMember] public string French { get; set; } + [DataMember] public string Italian { get; set; } + [DataMember] public string Spanish { get; set; } + [DataMember] public string Portuguese { get; set; } + [DataMember] public string Polish { get; set; } + [DataMember] public string Czech { get; set; } + [DataMember] public string Hungarian { get; set; } + [DataMember] public string Russian { get; set; } + [DataMember] public string Turkish { get; set; } + [DataMember] public string Japanese { get; set; } + [DataMember] public string Chinesesimp { get; set; } + [DataMember] public string Chinese { get; set; } + [DataMember] public string Korean { get; set; } + + [IgnoreDataMember] + [XmlIgnore] + [SoapIgnore] + public string PackageName { get; set; } + [IgnoreDataMember] + [XmlIgnore] + [SoapIgnore] + public string ContainerName { get; set; } + + //[IgnoreDataMember] + //[XmlIgnore] + //[SoapIgnore] + //public bool IsComplete { get; set; } + + //[IgnoreDataMember] + //[XmlIgnore] + //[SoapIgnore] + //public string IsCompleteName { get { return IsComplete ? "Complete translation" : "Incomplete translation"; } } + + //private bool IsLanguageComplete(string nameofProp, string valuesOfProp, List languagesToHave) + //{ + // if (languagesToHave.Any(x => x == nameofProp)) + // { + // if (string.IsNullOrEmpty(valuesOfProp)) + // { + // return false; + // } + // } + // return true; + //} + + //public void UpdateIsComplete(List languagesToHave) + //{ + // if (!IsLanguageComplete(nameof(English), English, languagesToHave)) + // { + // IsComplete = false; + // return; + // }; + // if (!IsLanguageComplete(nameof(German), German, languagesToHave)) + // { + // IsComplete = false; + // return; + // }; + // if (!IsLanguageComplete(nameof(French), French, languagesToHave)) + // { + // IsComplete = false; + // return; + // }; + // if (!IsLanguageComplete(nameof(Italian), Italian, languagesToHave)) + // { + // IsComplete = false; + // return; + // }; + // if (!IsLanguageComplete(nameof(Spanish), Spanish, languagesToHave)) + // { + // IsComplete = false; + // return; + // }; + // if (!IsLanguageComplete(nameof(Portuguese), Portuguese, languagesToHave)) + // { + // IsComplete = false; + // return; + // }; + // if (!IsLanguageComplete(nameof(Polish), Polish, languagesToHave)) + // { + // IsComplete = false; + // return; + // }; + // if (!IsLanguageComplete(nameof(Czech), Czech, languagesToHave)) + // { + // IsComplete = false; + // return; + // }; + // if (!IsLanguageComplete(nameof(Hungarian), Hungarian, languagesToHave)) + // { + // IsComplete = false; + // return; + // }; + + // if (!IsLanguageComplete(nameof(Russian), Russian, languagesToHave)) + // { + // IsComplete = false; + // return; + // }; + + // if (!IsLanguageComplete(nameof(Turkish), Turkish, languagesToHave)) + // { + // IsComplete = false; + // return; + // }; + + // if (!IsLanguageComplete(nameof(Japanese), Japanese, languagesToHave)) + // { + // IsComplete = false; + // return; + // }; + + // if (!IsLanguageComplete(nameof(Chinesesimp), Chinesesimp, languagesToHave)) + // { + // IsComplete = false; + // return; + // }; + + // if (!IsLanguageComplete(nameof(Chinese), Chinese, languagesToHave)) + // { + // IsComplete = false; + // return; + // }; + // if (!IsLanguageComplete(nameof(Korean), Korean, languagesToHave)) + // { + // IsComplete = false; + // return; + // }; + + // IsComplete = true; + //} + + //public bool ContainsText(string value, bool searchOnlyInId, bool ignoreCase) + //{ + // var comp = StringComparison.InvariantCulture; + + // if (ignoreCase) + // { + // comp = StringComparison.InvariantCultureIgnoreCase; + // } + + // if (Id.ContainsEx(value, comp)) + // { + // return true; + // } + + // if (searchOnlyInId) + // { + // return false; + // } + + // if (English.ContainsEx(value, comp)) + // { + // return true; + // } + // if (German.ContainsEx(value, comp)) + // { + // return true; + // } + // if (French.ContainsEx(value, comp)) + // { + // return true; + // } + // if (Italian.ContainsEx(value, comp)) + // { + // return true; + // } + // if (Spanish.ContainsEx(value, comp)) + // { + // return true; + // } + // if (Portuguese.ContainsEx(value, comp)) + // { + // return true; + // } + // if (Polish.ContainsEx(value, comp)) + // { + // return true; + // } + // if (Czech.ContainsEx(value, comp)) + // { + // return true; + // } + // if (Hungarian.ContainsEx(value, comp)) + // { + // return true; + // } + // if (Russian.ContainsEx(value, comp)) + // { + // return true; + // } + // if (Turkish.ContainsEx(value, comp)) + // { + // return true; + // } + // if (Japanese.ContainsEx(value, comp)) + // { + // return true; + // } + // if (Chinesesimp.ContainsEx(value, comp)) + // { + // return true; + // } + // if (Chinese.ContainsEx(value, comp)) + // { + // return true; + // } + // if (Korean.ContainsEx(value, comp)) + // { + // return true; + // } + + // return false; + //} + + //internal XElement AsXElement(bool ignoreEmptyValues, List languagesToWrite) + //{ + // var res= new XElement("Key", new XAttribute("ID", Id)); + + // AddIfNecessary(res,"English", English, ignoreEmptyValues, languagesToWrite); + // AddIfNecessary(res, "German", German, ignoreEmptyValues, languagesToWrite); + // AddIfNecessary(res, "Italian", Italian, ignoreEmptyValues, languagesToWrite); + // AddIfNecessary(res, "Spanish", Spanish, ignoreEmptyValues, languagesToWrite); + // AddIfNecessary(res, "Portuguese", Portuguese, ignoreEmptyValues, languagesToWrite); + // AddIfNecessary(res, "Polish", Polish, ignoreEmptyValues, languagesToWrite); + // AddIfNecessary(res, "Czech", Czech, ignoreEmptyValues, languagesToWrite); + // AddIfNecessary(res, "Hungarian", Hungarian, ignoreEmptyValues, languagesToWrite); + // AddIfNecessary(res, "Russian", Russian, ignoreEmptyValues, languagesToWrite); + // AddIfNecessary(res, "Turkish", Turkish, ignoreEmptyValues, languagesToWrite); + // AddIfNecessary(res, "Japanese", Japanese, ignoreEmptyValues, languagesToWrite); + // AddIfNecessary(res, "Chinesesimp", Chinesesimp, ignoreEmptyValues, languagesToWrite); + // AddIfNecessary(res, "Chinese", Chinese, ignoreEmptyValues, languagesToWrite); + // AddIfNecessary(res, "Korean", Korean, ignoreEmptyValues, languagesToWrite); + + // return res; + //} + + //private void AddIfNecessary(XElement parent,string nameOfKey , string valueOfKey, bool ignoreEmptyValues, List languagesToWrite) + //{ + // if (ignoreEmptyValues && string.IsNullOrEmpty(valueOfKey)) + // { + // return; + // } + + // if (!languagesToWrite.Contains(nameOfKey)) + // { + // return; + // } + + // parent.Add(new XElement(nameOfKey, valueOfKey)); + + + + //} + } } diff --git a/tabler.Logic/Classes/Package.cs b/tabler.Logic/Classes/Package.cs index c56011c..cb2dfee 100644 --- a/tabler.Logic/Classes/Package.cs +++ b/tabler.Logic/Classes/Package.cs @@ -1,4 +1,7 @@ +using System; using System.Collections.Generic; +using System.Linq; +using System.Xml.Linq; using System.Xml.Serialization; namespace tabler.Logic.Classes { @@ -12,5 +15,10 @@ public class Package { [XmlElement("Key")] public List Keys { get; set; } + + internal XElement AsXElement(bool ignoreEmptyValues, List languagesToWrite) + { + return new XElement("Package", new XAttribute("name", Name), Keys.Select(x => x.AsXElement( ignoreEmptyValues, languagesToWrite)).ToList()); + } } } diff --git a/tabler.Logic/Classes/Project.cs b/tabler.Logic/Classes/Project.cs index b33a553..0038545 100644 --- a/tabler.Logic/Classes/Project.cs +++ b/tabler.Logic/Classes/Project.cs @@ -1,4 +1,6 @@ using System.Collections.Generic; +using System.Linq; +using System.Xml.Linq; using System.Xml.Serialization; namespace tabler.Logic.Classes { @@ -11,5 +13,11 @@ public class Project { [XmlElement("Package")] public List Packages { get; set; } + + public XElement AsXelement(bool ignoreEmptyValues, List languagesToWrite) + { + return new XElement("Project", new XAttribute("name", Name), Packages.Select(x=> x.AsXElement(ignoreEmptyValues, languagesToWrite)).ToList()); + } + } } diff --git a/tabler.Logic/Classes/Settings.cs b/tabler.Logic/Classes/Settings.cs index 493c172..d336bdc 100644 --- a/tabler.Logic/Classes/Settings.cs +++ b/tabler.Logic/Classes/Settings.cs @@ -7,11 +7,19 @@ public Settings() // defaults IndentationSettings = IndentationSettings.Spaces; TabSize = 4; + Language = "de-DE"; + LastPathOfDataFiles = ""; + RemoveEmptyNodes = false; } public IndentationSettings IndentationSettings { get; set; } - public int TabSize { get; set; } + public string Language { get; set; } + public string LastPathOfDataFiles { get; set; } + public bool RemoveEmptyNodes { get; set; } + + + } public enum IndentationSettings diff --git a/tabler.Logic/Enums/LogTypeEnum.cs b/tabler.Logic/Enums/LogTypeEnum.cs new file mode 100644 index 0000000..d2fbffb --- /dev/null +++ b/tabler.Logic/Enums/LogTypeEnum.cs @@ -0,0 +1,9 @@ +namespace tabler.Logic.Enums +{ + public enum LogTypeEnum + { + General = 0, + Error = 1, + Internal = 2 + } +} diff --git a/tabler.Logic/Extensions/ExtensionMethods.cs b/tabler.Logic/Extensions/ExtensionMethods.cs new file mode 100644 index 0000000..0522f97 --- /dev/null +++ b/tabler.Logic/Extensions/ExtensionMethods.cs @@ -0,0 +1,13 @@ + +using System; + +namespace tabler.Logic.Extensions +{ + public static class ExtensionMethods + { + public static bool ContainsEx(this string source, string toCheck, StringComparison comp) + { + return source?.IndexOf(toCheck, comp) >= 0; + } + } +} diff --git a/tabler.Logic/Helper/ConfigHelper.cs b/tabler.Logic/Helper/ConfigHelper.cs index 7b2d945..7bdbd43 100644 --- a/tabler.Logic/Helper/ConfigHelper.cs +++ b/tabler.Logic/Helper/ConfigHelper.cs @@ -1,3 +1,4 @@ +using Polenter.Serialization; using System; using System.Collections.Generic; using System.IO; @@ -8,209 +9,51 @@ namespace tabler.Logic.Helper { - public class ConfigHelper + public static class ConfigHelper { - private const string LASTPATHTODATAFILES_NAME = "LastPathToDataFiles"; - private const string INDENTATION_NAME = "Indentation"; - private const string TABSIZE_NAME = "TabSize"; - private const string EMPTYNODES_NAME = "RemoveEmptyNodes"; + private static readonly FileInfo _fiConfig = new FileInfo(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"config\config.xml")); - private readonly FileInfo _fiConfig = new FileInfo(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"config\config.xml")); - private XDocument _xDocConfig; + public static Settings CurrentSettings { get; set; } - public ConfigHelper() + static ConfigHelper() { //create dir if (_fiConfig.Directory != null && _fiConfig.Directory.Exists == false) { _fiConfig.Directory.Create(); } - } - - - private XDocument CreateOrLoadConfig(bool forceCreation) - { - if (_xDocConfig != null && forceCreation == false) + if (!_fiConfig.Exists) { - return _xDocConfig; - } - - if (_fiConfig.Exists && forceCreation == false) - { - _xDocConfig = XDocument.Load(_fiConfig.FullName); + CurrentSettings = new Settings(); + SaveSettings(); } else { - var path = new XElement(LASTPATHTODATAFILES_NAME); - var indent = new XElement(INDENTATION_NAME, 0); - var tabsize = new XElement(TABSIZE_NAME, 4); - var removeEmptyNodes = new XElement(EMPTYNODES_NAME, true); - - var lstElements = new List {path, indent, tabsize, removeEmptyNodes}; - - _xDocConfig = new XDocument( - new XDeclaration("1.0", "utf-8", "yes"), - new XComment("Config file"), - new XElement("config", lstElements.ToArray())); - - SaveConfigXml(); - - return _xDocConfig; + LoadSettings(); } - - return null; } - - public void SetLastPathOfDataFiles(DirectoryInfo path) + public static void SaveSettings() { - if (path == null || path.Exists == false) + if (CurrentSettings == null) { return; } - - if (_xDocConfig == null) - { - CreateOrLoadConfig(false); - } - - - if (_xDocConfig != null) - { - var pathElement = _xDocConfig.Descendants().FirstOrDefault(d => d.Name == LASTPATHTODATAFILES_NAME); - - if (pathElement != null) - { - pathElement.Value = XmlConvert.EncodeName(path.FullName); - } - } - - SaveConfigXml(); - } - - public DirectoryInfo GetLastPathOfDataFiles() - { - if (_xDocConfig == null) - { - CreateOrLoadConfig(false); - } - - - if (_xDocConfig != null) - { - var pathElement = _xDocConfig.Descendants().FirstOrDefault(d => d.Name == LASTPATHTODATAFILES_NAME); - - if (pathElement != null) - { - var value = XmlConvert.DecodeName(pathElement.Value); - if (string.IsNullOrEmpty(value) == false) - { - return new DirectoryInfo(value); - } - } - else - { - CreateOrLoadConfig(true); - } - } - - return null; - } - - /// - /// Saves the xml to the file system - /// - private void SaveConfigXml() - { - if (_xDocConfig != null) - { - _xDocConfig.Save(_fiConfig.FullName); - } + var serializer = new SharpSerializer(); + serializer.Serialize(CurrentSettings, _fiConfig.FullName); } - /// - /// Read Settings from config file - /// - /// - public Settings GetSettings() + public static void LoadSettings() { - if (_xDocConfig == null) - { - CreateOrLoadConfig(false); - } - - if (_xDocConfig == null) - { - return null; - } - - var loadedSettings = new Settings(); - - var indentElement = _xDocConfig.Descendants().FirstOrDefault(d => d.Name == INDENTATION_NAME); - if (indentElement != null) + try { - try - { - loadedSettings.IndentationSettings = (IndentationSettings) Enum.Parse(typeof(IndentationSettings), indentElement.Value); - } - catch (Exception) - { - // in case of error, use the better method - loadedSettings.IndentationSettings = IndentationSettings.Spaces; - } + var serializer = new SharpSerializer(); + CurrentSettings = (Settings)serializer.Deserialize(_fiConfig.FullName); } - - var tabSizeElement = _xDocConfig.Descendants().FirstOrDefault(d => d.Name == TABSIZE_NAME); - if (tabSizeElement != null) + catch (Exception ex) { - loadedSettings.TabSize = int.Parse(tabSizeElement.Value); + Logger.LogEx(ex); } - - return loadedSettings; - } - - /// - /// Read Settings from config file - /// - /// - public bool SaveSettings(Settings settingsToSave) - { - if (settingsToSave == null) - { - return false; - } - - if (_xDocConfig == null) - { - CreateOrLoadConfig(false); - } - - if (_xDocConfig != null) - { - var indentElement = _xDocConfig.Descendants().FirstOrDefault(d => d.Name == INDENTATION_NAME); - if (indentElement != null) - { - indentElement.Value = settingsToSave.IndentationSettings.ToString(); - } - else - { - CreateOrLoadConfig(true); - } - - var tabSizeElement = _xDocConfig.Descendants().FirstOrDefault(d => d.Name == TABSIZE_NAME); - if (tabSizeElement != null) - { - tabSizeElement.Value = settingsToSave.TabSize.ToString(); - } - else - { - CreateOrLoadConfig(true); - } - - SaveConfigXml(); - return true; - } - - return false; - } + + } } } diff --git a/tabler.Logic/Helper/Logger.cs b/tabler.Logic/Helper/Logger.cs new file mode 100644 index 0000000..db5fddd --- /dev/null +++ b/tabler.Logic/Helper/Logger.cs @@ -0,0 +1,66 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using tabler.Logic.Enums; + +namespace tabler.Logic.Helper +{ + public static class Logger + { + public delegate void LogMessageDelegate(string message); + + public static event LogMessageDelegate LogMessageArrived; + + public static void FireLogMessageArivedEvent(string message) + { + LogMessageArrived?.Invoke(message); + } + + public delegate void LogMessageWithTypeDelegate(string message, LogTypeEnum logType); + + public static event LogMessageWithTypeDelegate LogMessageWithTypeArrived; + + public static void FireLogMessageWithTyperArivedEvent(string message, LogTypeEnum logType) + { + LogMessageWithTypeArrived?.Invoke(message, logType); + } + public static void Log(string message, LogTypeEnum logType) + { + FireLogMessageArivedEvent(message); + FireLogMessageWithTyperArivedEvent(message, logType); + + } + public static void Log(string message) + { + Log(message, LogTypeEnum.General); + } + + /// + /// Logs the specified message. + /// + /// The message. + /// Type of the log. + public static void LogError(string message) + { + Log(message, LogTypeEnum.Error); + } + + public static void LogEx(Exception ex) + { + Log(ex.ToString(), LogTypeEnum.Error); + } + + public static void LogGeneral(string message) + { + Log(message, LogTypeEnum.General); + } + + public static void LogInternal(string message) + { + Log(message, LogTypeEnum.Internal); + } + + } +} diff --git a/tabler.Logic/Helper/StringtableHelper.cs b/tabler.Logic/Helper/StringtableHelper.cs index 2444a96..93a2069 100644 --- a/tabler.Logic/Helper/StringtableHelper.cs +++ b/tabler.Logic/Helper/StringtableHelper.cs @@ -1,3 +1,5 @@ +using Polenter.Serialization; +using Polenter.Serialization.Advanced.Xml; using System; using System.Collections.Generic; using System.IO; @@ -5,19 +7,21 @@ using System.Text; using System.Threading.Tasks; using System.Xml; +using System.Xml.Linq; using System.Xml.Serialization; using tabler.Logic.Classes; using tabler.Logic.Exceptions; namespace tabler.Logic.Helper { - public class StringtableHelper + public static class StringtableHelper { - private XmlReaderSettings _xmlReaderSettings; + private static XmlReaderSettings _xmlReaderSettings; - public XmlReaderSettings XmlReaderSettings + public static XmlReaderSettings XmlReaderSettings { - get { + get + { if (_xmlReaderSettings == null) { var settings = new XmlReaderSettings @@ -36,25 +40,30 @@ public XmlReaderSettings XmlReaderSettings /// /// /// - public IEnumerable ParseStringtables(IEnumerable allStringtableFiles) + public static IEnumerable ParseStringtables(IEnumerable allStringtableFiles) { var stringtables = new System.Collections.Concurrent.ConcurrentBag(); Parallel.ForEach(allStringtableFiles, currentFile => { - var stringtable = ParseXmlFile(currentFile); - ValidateStringtable(stringtable); - stringtables.Add(stringtable); + stringtables.Add(ParseStringtable(currentFile)); }); return stringtables.ToList(); } + public static Stringtable ParseStringtable(FileInfo stringtableFile) + { + + var stringtable = ParseXmlFile(stringtableFile); + ValidateStringtable(stringtable); + return stringtable; + } /// /// /// /// /// - private Stringtable ParseXmlFile(FileInfo fileInfo) + private static Stringtable ParseXmlFile(FileInfo fileInfo) { var stringtable = new Stringtable { @@ -72,7 +81,22 @@ private Stringtable ParseXmlFile(FileInfo fileInfo) using (var reader = XmlReader.Create(sr.BaseStream, XmlReaderSettings)) { - stringtable.Project = (Project) ser.Deserialize(reader); + stringtable.Project = (Project)ser.Deserialize(reader); + foreach (var package in stringtable.Project.Packages) + { + foreach (var item in package.Keys) + { + item.PackageName = package.Name; + } + foreach (var container in package.Containers) + { + foreach (var item in package.Keys) + { + item.PackageName = package.Name; + item.ContainerName = container.Name; + } + } + } } } } @@ -95,11 +119,13 @@ private Stringtable ParseXmlFile(FileInfo fileInfo) return stringtable; } + + /// /// /// /// - private void ValidateStringtable(Stringtable stringtable) + private static void ValidateStringtable(Stringtable stringtable) { var duplicates = stringtable.AllKeys.GroupBy(k => k.Id).Where(g => g.Skip(1).Any()).ToList(); if (duplicates.Any()) @@ -110,74 +136,99 @@ private void ValidateStringtable(Stringtable stringtable) } } + + /// /// /// /// /// - public void SaveStringtableFiles(List filesByNameInDirectory, IEnumerable lstStringtables) + public static void SaveStringtableFiles(List filesByNameInDirectory, IEnumerable lstStringtables) + { + Parallel.ForEach(filesByNameInDirectory, currentFileInfo => + { + var currentStringtable = lstStringtables.FirstOrDefault(x => string.Equals(x.Name.ToLowerInvariant(), currentFileInfo.Directory.Name.ToLowerInvariant(), StringComparison.OrdinalIgnoreCase)); + + SaveStringTableFile(currentFileInfo, currentStringtable); + }); + } + + public static void SaveStringTableFile(FileInfo currentFileInfo, Stringtable currentStringtable, List header) { - var configHelper = new ConfigHelper(); - var settings = configHelper.GetSettings(); + if (currentStringtable == null) + { + return; + } + + if (!currentStringtable.HasChanges) + { + return; + } var dummyNamespace = new XmlSerializerNamespaces(); - dummyNamespace.Add("",""); + dummyNamespace.Add("", ""); - Parallel.ForEach(filesByNameInDirectory, currentFileInfo => + var xmlSettings = new XmlWriterSettings { - var currentStringtable = lstStringtables.FirstOrDefault(x => string.Equals(x.Name.ToLowerInvariant(), currentFileInfo.Directory.Name.ToLowerInvariant(), StringComparison.OrdinalIgnoreCase)); + Indent = true, + IndentChars = " ", + Encoding = new UTF8Encoding(currentStringtable.FileHasBom) + }; - if (currentStringtable == null) - { - return; - } + if (ConfigHelper.CurrentSettings.IndentationSettings == IndentationSettings.Spaces) + { + var indentChars = ""; - if (!currentStringtable.HasChanges) + for (var i = 0; i < ConfigHelper.CurrentSettings.TabSize; i++) { - return; + indentChars += " "; } + xmlSettings.IndentChars = indentChars; + } - var xmlSettings = new XmlWriterSettings - { - Indent = true, - IndentChars = " ", - Encoding = new UTF8Encoding(currentStringtable.FileHasBom) - }; + if (ConfigHelper.CurrentSettings.IndentationSettings == IndentationSettings.Tabs) + { + xmlSettings.IndentChars = "\t"; + } + + XDocument srcTree = new XDocument( new XDeclaration("1.0","utf-8","true"),currentStringtable.Project.AsXelement(true, header.Where(x => x.IsSelected).Select(x=> x.Key).ToList())); - if (settings != null) - { - if (settings.IndentationSettings == IndentationSettings.Spaces) - { - var indentChars = ""; + var xmlSerializer = new XmlSerializer(typeof(Project)); - for (var i = 0; i < settings.TabSize; i++) - { - indentChars += " "; - } + using (var writer = XmlWriter.Create(currentFileInfo.FullName, xmlSettings)) + { + //xmlSerializer.Serialize(writer, currentStringtable.Project, dummyNamespace); + srcTree.Save(writer); + } - xmlSettings.IndentChars = indentChars; - } + File.AppendAllText(currentFileInfo.FullName, Environment.NewLine); - if (settings.IndentationSettings == IndentationSettings.Tabs) - { - xmlSettings.IndentChars = "\t"; - } + currentStringtable.HasChanges = false; - // TODO Remove empty nodes + } - } + private class Conv : ISimpleValueConverter + { + public object ConvertFromString(string text, Type type) + { + throw new NotImplementedException(); + } + + public string ConvertToString(object value) + { + throw new NotImplementedException(); + } + } + + public static void SaveStringTableFile(FileInfo currentFileInfo, Stringtable currentStringtable) + { + SaveStringTableFile(currentFileInfo, currentStringtable, null); - var xmlSerializer = new XmlSerializer(typeof(Project)); - using (var writer = XmlWriter.Create(currentFileInfo.FullName, xmlSettings)) - { - xmlSerializer.Serialize(writer, currentStringtable.Project,dummyNamespace); - } - File.AppendAllText(currentFileInfo.FullName, Environment.NewLine); - currentStringtable.HasChanges = false; - }); } + + } } diff --git a/tabler.Logic/Helper/TranslationHelper.cs b/tabler.Logic/Helper/TranslationHelper.cs index f51b0e3..95641ab 100644 --- a/tabler.Logic/Helper/TranslationHelper.cs +++ b/tabler.Logic/Helper/TranslationHelper.cs @@ -16,8 +16,65 @@ public class TranslationHelper private readonly FileInfo _fiExcelFile; public TranslationComponents TranslationComponents; + public static List GetHeaders(Stringtable stringtable) + { + + var headers = new List(); + // Get list of all used languages + var allKeys = stringtable.Project.Packages.SelectMany(p => + { + var keys = new List(); + + if (p.Containers.Any()) + { + keys.AddRange(p.Containers.SelectMany(c => c.Keys)); + } + + keys.AddRange(p.Keys); + + return keys; + }); + + var keyPropertyInfos = typeof(Key).GetProperties(BindingFlags.Public | BindingFlags.Instance); + foreach (var key in allKeys) + { + foreach (var property in keyPropertyInfos) + { + if (property.Name.ToLowerInvariant() == COLUMN_IDNAME.ToLowerInvariant() || headers.Contains(property.Name)) + { + continue; + } - private List PrepareHeaders(IEnumerable stringtables) + var value = property.GetValue(key, null)?.ToString(); + if (value != null && !string.IsNullOrEmpty(value)) + { + headers.Add(property.Name); + } + } + } + + headers = headers.OrderBy(l => l).ToList(); + + var hasOriginal = false; + + if (headers.Any(x => x.ToLowerInvariant() == Languages.Original.ToString().ToLowerInvariant())) + { + hasOriginal = true; + headers.Remove(Languages.Original.ToString()); + headers.Insert(0, Languages.Original.ToString()); + } + + if (headers.Any(x => x.ToLowerInvariant() == Languages.English.ToString().ToLowerInvariant())) + { + headers.Remove(Languages.English.ToString()); + headers.Insert(hasOriginal ? 1 : 0, Languages.English.ToString()); + } + + headers.Insert(0, COLUMN_IDNAME); + + return headers; + } + public static List GetHeaders(IEnumerable stringtables) { var headers = new List(); @@ -86,13 +143,13 @@ private TranslationComponents GetTranslationComponents(DirectoryInfo lastPathToD return null; } - var sh = new StringtableHelper(); + var transComp = new TranslationComponents { - Stringtables = sh.ParseStringtables(allStringtableFiles) + Stringtables = StringtableHelper.ParseStringtables(allStringtableFiles) }; - transComp.Headers = PrepareHeaders(transComp.Stringtables); + transComp.Headers = GetHeaders(transComp.Stringtables); TranslationComponents = transComp; return TranslationComponents; @@ -106,8 +163,7 @@ private static bool SaveModInfosToXml(DirectoryInfo lastPathToDataFiles, IEnumer // too tired :D -> TODO var filesByNameInDirectory = FileSystemHelper.GetFilesByNameInDirectory(lastPathToDataFiles, STRINGTABLE_NAME, SearchOption.AllDirectories); - var sh = new StringtableHelper(); - sh.SaveStringtableFiles(filesByNameInDirectory, lstStringtables); + StringtableHelper.SaveStringtableFiles(filesByNameInDirectory, lstStringtables); return true; } diff --git a/tabler.Logic/packages.config b/tabler.Logic/packages.config index 5c42880..77e9bb0 100644 --- a/tabler.Logic/packages.config +++ b/tabler.Logic/packages.config @@ -1,4 +1,5 @@  + \ No newline at end of file diff --git a/tabler.Logic/tabler.Logic.csproj b/tabler.Logic/tabler.Logic.csproj index c3a3b1d..51c5a74 100644 --- a/tabler.Logic/tabler.Logic.csproj +++ b/tabler.Logic/tabler.Logic.csproj @@ -34,8 +34,13 @@ ..\packages\Octokit.0.32.0\lib\net45\Octokit.dll + + ..\packages\SharpSerializer.3.0.1\lib\net452\Polenter.SharpSerializer.dll + + + @@ -46,6 +51,7 @@ + @@ -55,7 +61,10 @@ + + + diff --git a/tabler.sln b/tabler.sln index ac59d15..bf47270 100644 --- a/tabler.sln +++ b/tabler.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.27703.2042 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.28803.452 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "tabler", "tabler\tabler.csproj", "{FE0D5379-28A9-47F8-86F5-19100816A8D9}" EndProject @@ -12,6 +12,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "tabler.Logic", "tabler.Logic\tabler.Logic.csproj", "{651801FA-F7AE-4F9B-9A7C-2DDEA5965440}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "tabler.wpf", "tabler.wpf\tabler.wpf.csproj", "{A6677EF8-6AB9-4976-A218-89470EE4B9C9}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -26,6 +28,10 @@ Global {651801FA-F7AE-4F9B-9A7C-2DDEA5965440}.Debug|Any CPU.Build.0 = Debug|Any CPU {651801FA-F7AE-4F9B-9A7C-2DDEA5965440}.Release|Any CPU.ActiveCfg = Release|Any CPU {651801FA-F7AE-4F9B-9A7C-2DDEA5965440}.Release|Any CPU.Build.0 = Release|Any CPU + {A6677EF8-6AB9-4976-A218-89470EE4B9C9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A6677EF8-6AB9-4976-A218-89470EE4B9C9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A6677EF8-6AB9-4976-A218-89470EE4B9C9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A6677EF8-6AB9-4976-A218-89470EE4B9C9}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/tabler.wpf/App.config b/tabler.wpf/App.config new file mode 100644 index 0000000..56efbc7 --- /dev/null +++ b/tabler.wpf/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/tabler.wpf/Container/Key_ExtendedWithChangeTracking.cs b/tabler.wpf/Container/Key_ExtendedWithChangeTracking.cs new file mode 100644 index 0000000..b009a6d --- /dev/null +++ b/tabler.wpf/Container/Key_ExtendedWithChangeTracking.cs @@ -0,0 +1,184 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Runtime.Serialization; +using System.Text; +using System.Threading.Tasks; +using System.Xml.Linq; +using MS.Internal.Annotations; +using tabler.Logic.Classes; +using tabler.Logic.Extensions; + +namespace tabler.wpf.Container +{ + [DataContract] + [Serializable] //for copy paste action + public class Key_ExtendedWithChangeTracking + { + [DataMember] + public Dictionary Languages { get; set; } = new Dictionary(); + [DataMember] + public Dictionary SystemValues { get; set; } = new Dictionary(); + + private const string IsComplete_PropertyName = "IsComplete"; + private const string Id_PropertyName = "Id"; + private const string Original_PropertyName = "Original"; + private const string PackageName_PropertyName = "PackageName"; + private const string ContainerName_PropertyName = "ContainerName"; + + public Key_ExtendedWithChangeTracking() + { + + } + + public Key_ExtendedWithChangeTracking(Key key) + { + SystemValues.Add(nameof(key.Id),new ChangeTrackerString( key.Id)); + SystemValues.Add(nameof(key.Original), new ChangeTrackerString(key.Original)); + SystemValues.Add(nameof(key.ContainerName), new ChangeTrackerString(key.ContainerName)); + SystemValues.Add(nameof(key.PackageName), new ChangeTrackerString(key.PackageName)); + SystemValues.Add(IsCompletePropertyName, new ChangeTrackerString("false")); + + Languages.Add(nameof(key.Chinese), new ChangeTrackerString(key.Chinese)); + Languages.Add(nameof(key.Chinesesimp), new ChangeTrackerString(key.Chinesesimp)); + Languages.Add(nameof(key.Czech), new ChangeTrackerString(key.Czech)); + Languages.Add(nameof(key.English), new ChangeTrackerString(key.English)); + Languages.Add(nameof(key.French), new ChangeTrackerString(key.French)); + Languages.Add(nameof(key.German), new ChangeTrackerString(key.German)); + Languages.Add(nameof(key.Hungarian), new ChangeTrackerString(key.Hungarian)); + Languages.Add(nameof(key.Italian), new ChangeTrackerString(key.Italian)); + Languages.Add(nameof(key.Japanese), new ChangeTrackerString(key.Japanese)); + Languages.Add(nameof(key.Korean), new ChangeTrackerString(key.Korean)); + Languages.Add(nameof(key.Polish), new ChangeTrackerString(key.Polish)); + Languages.Add(nameof(key.Portuguese), new ChangeTrackerString(key.Portuguese)); + Languages.Add(nameof(key.Russian), new ChangeTrackerString(key.Russian)); + Languages.Add(nameof(key.Spanish), new ChangeTrackerString(key.Spanish)); + Languages.Add(nameof(key.Turkish), new ChangeTrackerString(key.Turkish)); + } + + public void Update_IsCompleted(List languagesToHave) + { + foreach (var language in languagesToHave) + { + if (string.IsNullOrEmpty(Languages[language].CurrentValue)) + { + SystemValues[IsCompletePropertyName].CurrentValue = "false"; + return; + }; + } + + SystemValues[IsCompletePropertyName].CurrentValue = "true"; + } + + public bool ContainsText(string value, bool searchOnlyInId, bool ignoreCase) + { + var comp = StringComparison.InvariantCulture; + + if (ignoreCase) + { + comp = StringComparison.InvariantCultureIgnoreCase; + } + + if (SystemValues[Id_PropertyName].CurrentValue.ContainsEx(value, comp)) + { + return true; + } + + if (searchOnlyInId) + { + return false; + } + + foreach (var language in Languages.Values) + { + if (language.CurrentValue.ContainsEx(value, comp)) + { + return true; + } + } + + + return false; + } + + internal XElement AsXElement(bool ignoreEmptyValues, List languagesToWrite) + { + var res = new XElement("Key", new XAttribute("ID", SystemValues[Id_PropertyName].CurrentValue)); + + foreach (var item in languagesToWrite) + { + AddIfNecessary(res, item, Languages[item].CurrentValue, ignoreEmptyValues); + } + + return res; + } + + private void AddIfNecessary(XElement parent, string nameOfKey, string valueOfKey, bool ignoreEmptyValues) + { + if (ignoreEmptyValues && string.IsNullOrEmpty(valueOfKey)) + { + return; + } + + parent.Add(new XElement(nameOfKey, valueOfKey)); + } + } + + //todo something generic + public class ChangeTrackerString : INotifyPropertyChanged + { + public event PropertyChangedEventHandler PropertyChanged; + + public string OriginalValue { get; set; } + private string _currentValue; + private bool _hasChanged; + + public ChangeTrackerString(string originalValue) + { + OriginalValue = originalValue; + _currentValue = OriginalValue; + } + + private void RaisePropertyChanged(string propName) + { + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propName)); + } + + public bool HasChanged { get => _hasChanged; set => _hasChanged = value; } + + + public string CurrentValue + { + get { return _currentValue; } + set + { + if (OriginalValue != value) + { + + _currentValue = value; + RaisePropertyChanged(nameof(CurrentValue)); + + if (HasChanged == false) + { + HasChanged = true; + RaisePropertyChanged(nameof(HasChanged)); + } + + } + else + { + if (HasChanged == true) + { + HasChanged = false; + RaisePropertyChanged(nameof(HasChanged)); + } + + } + } + } + + } + + +} diff --git a/tabler.wpf/Container/VersionInfoContainer.cs b/tabler.wpf/Container/VersionInfoContainer.cs new file mode 100644 index 0000000..bdd7519 --- /dev/null +++ b/tabler.wpf/Container/VersionInfoContainer.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using tabler.wpf.Helper; + +namespace tabler.wpf.Container +{ + public class VersionInfoContainer + { + + public VersionInfoContainer() + { + Fixes = new List(); + Features = new List(); + SpecialThanks = new List(); + } + + public DateTime ReleaseDate { get; set; } + + public string ReleaseDateStr => ReleaseDate.GetDateTimeString_yyyyMMddhhmmss(); + + + public string Version { get; set; } + public List Fixes { get; set; } + public List Features { get; set; } + public List SpecialThanks { get; set; } + + public string FixesStr => string.Join(Environment.NewLine, Fixes); + + public string FeaturesStr => string.Join(Environment.NewLine, Features); + + public string SpecialThanksStr => string.Join(",", SpecialThanks); + } +} diff --git a/tabler.wpf/Controls/General_VersionInfo.xaml b/tabler.wpf/Controls/General_VersionInfo.xaml new file mode 100644 index 0000000..775cdad --- /dev/null +++ b/tabler.wpf/Controls/General_VersionInfo.xaml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tabler.wpf/Controls/General_VersionInfo.xaml.cs b/tabler.wpf/Controls/General_VersionInfo.xaml.cs new file mode 100644 index 0000000..4aed5ff --- /dev/null +++ b/tabler.wpf/Controls/General_VersionInfo.xaml.cs @@ -0,0 +1,87 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Windows.Controls; +using tabler.wpf.Container; +using tabler.wpf.Helper; + +namespace tabler.wpf.Controls +{ + /// + /// Interaction logic for General_VersionInfo.xaml + /// + public partial class General_VersionInfo : UserControl + { + public General_VersionInfo() + { + InitializeComponent(); + + var lstVersions = new List(); + + _dgvVersionNumbers.SelectionMode = DataGridSelectionMode.Single; + + lstVersions.Add(CreateVersion00001()); + + _dgvVersionNumbers.ItemsSource = lstVersions; + + } + + private VersionInfoContainer CreateVersion00001() + { + var versionInfoContainer = new VersionInfoContainer + { + Version = "0.0.0.01", + ReleaseDate = new DateTime(2019, 9, 16) + }; + + versionInfoContainer.SpecialThanks.Add("Bux: for being very patient :D"); + + versionInfoContainer.Features.Add("- Initial release"); + + versionInfoContainer.Fixes.Add("- soon to come ;)"); + return versionInfoContainer; + } + + private string CreateResultStringFromVersionInfo(VersionInfoContainer version) + { + string result = string.Empty; + + result += "Version: " + version.Version + Environment.NewLine; + result += "ReleaseDate: " + version.ReleaseDate.ToString("yyyy.MM.dd") + Environment.NewLine; + if (!string.IsNullOrEmpty(version.SpecialThanksStr)) + { + result += "Special Thanks: " + version.SpecialThanksStr + Environment.NewLine; + } + + result += Environment.NewLine; + + result += "Features: " + Environment.NewLine; + result += "--------------------------------------------------------------------" + Environment.NewLine; + result += version.FeaturesStr + Environment.NewLine; + + + result += Environment.NewLine; + + result += "Bugfixes: " + Environment.NewLine; + result += "--------------------------------------------------------------------" + Environment.NewLine; + result += version.FixesStr + Environment.NewLine; + + result += Environment.NewLine; + + return result; + } + + private void _dgvVersionNumbers_OnSelectionChanged(object sender, SelectionChangedEventArgs e) + { + + if (_dgvVersionNumbers.SelectedItems.Count > 0) + { + var items = _dgvVersionNumbers.GetSelectedBoundItems(); + if (items != null && items.Any()) + { + _tbVersionInfos.Text = CreateResultStringFromVersionInfo(items.First()); + } + } + } + } +} diff --git a/tabler.wpf/Controls/Helper_DataGridExtended.cs b/tabler.wpf/Controls/Helper_DataGridExtended.cs new file mode 100644 index 0000000..c662166 --- /dev/null +++ b/tabler.wpf/Controls/Helper_DataGridExtended.cs @@ -0,0 +1,119 @@ + +using System; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Input; +using tabler.Logic.Helper; +using tabler.wpf.Helper; + +namespace tabler.wpf.Controls +{ + public class Helper_DataGridExtended : DataGrid + { + public Helper_DataGridExtended() + { + AutoGenerateColumns = false; + CanUserAddRows = false; + CanUserDeleteRows = false; + this.Initialized += (sender, args) => + { + + if (this.ContextMenu == null) + { + this.ContextMenu = new ContextMenu(); + } + var menu = new MenuItem { Header = "Switch copymode" }; + menu.Click += switchCopyMode; + this.ContextMenu.Items.Add(menu); + }; + //this.CommandBindings.Add(new CommandBinding(new Command() ) + + //CommandManager.RegisterClassCommandBinding(typeof(Helper_DataGridExtended), + // new CommandBinding(ApplicationCommands.Copy, + // new ExecutedRoutedEventHandler(OnExecutedCopy), + // new CanExecuteRoutedEventHandler(OnCanExecuteCopy))); + + //CommandManager.RegisterClassCommandBinding(typeof(Helper_DataGridExtended), + // new CommandBinding(ApplicationCommands.Paste, + // new ExecutedRoutedEventHandler(OnExecutedPaste), + // new CanExecuteRoutedEventHandler(OnCanExecutePaste))); + + //CommandManager.RegisterClassCommandBinding(typeof(DataGrid), + // new CommandBinding(ApplicationCommands.Paste, new ExecutedRoutedEventHandler(OnExecutedPaste), + // new CanExecuteRoutedEventHandler(OnCanExecutePaste))); + //CommandManager.RegisterClassCommandBinding(typeof(DataGridCell), + // new CommandBinding(ApplicationCommands.Paste, new ExecutedRoutedEventHandler(OnExecutedPaste), + // new CanExecuteRoutedEventHandler(OnCanExecutePaste))); + + //CommandManager.RegisterClassCommandBinding(typeof(DataGridColumn), + // new CommandBinding(ApplicationCommands.Paste, new ExecutedRoutedEventHandler(OnExecutedPaste), + // new CanExecuteRoutedEventHandler(OnCanExecutePaste))); + } + + //private void OnCanExecuteCopy(object sender, CanExecuteRoutedEventArgs args) + //{ + // args.CanExecute = true; + // args.Handled = true; + + //} + //private void OnExecutedCopy(object sender, ExecutedRoutedEventArgs args) + //{ + // var i = this.SelectedValue; + + //} + + + //private void OnCanExecutePaste(object sender, CanExecuteRoutedEventArgs args) + //{ + // args.CanExecute = CurrentCell != null; + // args.Handled = true; + //} + + //private void OnExecutedPaste(object sender, ExecutedRoutedEventArgs e) + //{ + // try + // { + + + // var k = ClipBoardHelper.GetKeyObjectFromClipboard(); + + // //if (!Clipboard.ContainsText()) + // //{ + // // return; + // //} + + // //var data = (string)Clipboard.GetData(DataFormats.UnicodeText); + + // //var cell = sender as DataGridCell; + // ////cell.IsEditing = true; + // //(cell.Content as TextBlock).Text = data; + // //cell.IsEditing = false; + // } + // catch (Exception ex) + // { + // Logger.LogEx(ex); + // } + //} + + + private void switchCopyMode(object sender, RoutedEventArgs e) + { + try + { + if (this.ClipboardCopyMode == DataGridClipboardCopyMode.IncludeHeader) + { + this.ClipboardCopyMode = DataGridClipboardCopyMode.ExcludeHeader; + } + else + { + this.ClipboardCopyMode = DataGridClipboardCopyMode.IncludeHeader; + } + Logger.LogGeneral($"Switched mode to: {this.ClipboardCopyMode}"); + } + catch (Exception ex) + { + Logger.LogError($"{nameof(Helper_DataGridExtended)}.{nameof(switchCopyMode)} Exception: {ex}"); + } + } + } +} diff --git a/tabler.wpf/Controls/Helper_LabelTextBox.xaml b/tabler.wpf/Controls/Helper_LabelTextBox.xaml new file mode 100644 index 0000000..524b0c8 --- /dev/null +++ b/tabler.wpf/Controls/Helper_LabelTextBox.xaml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + diff --git a/tabler.wpf/Controls/Helper_LabelTextBox.xaml.cs b/tabler.wpf/Controls/Helper_LabelTextBox.xaml.cs new file mode 100644 index 0000000..1c6c17e --- /dev/null +++ b/tabler.wpf/Controls/Helper_LabelTextBox.xaml.cs @@ -0,0 +1,128 @@ +using System; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Input; + +namespace tabler.wpf.Controls +{ + /// + /// Interaction logic for Helper_LabelTextBox.xaml + /// + public partial class Helper_LabelTextBox : UserControl + { + public Helper_LabelTextBox() + { + InitializeComponent(); + + TextBox.MouseLeftButtonUp += (sender, args) => + { + if (DoClearOnClickIn || DoClearOnClickInOnce) + { + TextBox.Text = string.Empty; + DoClearOnClickInOnce = false; + } + }; + } + + public static readonly DependencyProperty DoClearOnClickInOnceProperty = DependencyProperty.Register( + "DoClearOnClickInOnce", typeof (bool), typeof (Helper_LabelTextBox), new PropertyMetadata(default(bool))); + + public bool DoClearOnClickInOnce + { + get { return (bool) GetValue(DoClearOnClickInOnceProperty); } + set { SetValue(DoClearOnClickInOnceProperty, value); } + } + + public static readonly DependencyProperty DoClearOnClickInProperty = DependencyProperty.Register( + "DoClearOnClickIn", typeof (bool), typeof (Helper_LabelTextBox), new PropertyMetadata(default(bool))); + + public bool DoClearOnClickIn + { + get { return (bool) GetValue(DoClearOnClickInProperty); } + set { SetValue(DoClearOnClickInProperty, value); } + } + public static readonly DependencyProperty IsReadonlyProperty = DependencyProperty.Register("IsReadonly", typeof(bool), typeof(Helper_LabelTextBox), new PropertyMetadata(default(bool))); + + public bool IsReadonly + { + get { return (bool)GetValue(IsReadonlyProperty); } + set { SetValue(IsReadonlyProperty, value);} + } + + public static readonly DependencyProperty DescriptionProperty = DependencyProperty.Register("Description", typeof(string), typeof(Helper_LabelTextBox), new PropertyMetadata(default(string))); + + public string Description + { + get { return (string)GetValue(DescriptionProperty); } + set { SetValue(DescriptionProperty, value); } + } + + public static readonly DependencyProperty ValueProperty = DependencyProperty.Register("Value", typeof(string), typeof(Helper_LabelTextBox), new PropertyMetadata(default(string))); + + + + public string Value + { + get { return (string)GetValue(ValueProperty); } + set { SetValue(ValueProperty, value); } + } + //public static readonly DependencyProperty DescriptionProperty = DependencyProperty.Register( + // "Description", typeof (string), typeof (Helper_LabelTextBox), new PropertyMetadata(default(string))); + + //public string Description + //{ + // get { return (string) GetValue(DescriptionProperty); } + // set { SetValue(DescriptionProperty, value); } + //} + + + //public static readonly DependencyProperty ValueProperty = DependencyProperty.Register( + // "Value", typeof (string), typeof (Helper_LabelTextBox), new PropertyMetadata(default(string))); + + //public string Value + //{ + // get { return (string) GetValue(ValueProperty); } + // set { SetValue(ValueProperty, value); } + //} + + private void keyPressedinTextbox(object sender, KeyEventArgs e) + { + if (e.Key == Key.Enter) + { + EnterPressed?.Invoke(Value); + } + } + + public delegate void EnterPressedDelegate(string value); + public event EnterPressedDelegate EnterPressed; + + public delegate void CharactersEnteredCountDelegate(int value); + public event CharactersEnteredCountDelegate CharactersEnteredCount; + + public delegate void ThreeOrMoreCharactersEnteredDelegate(string value); + public event ThreeOrMoreCharactersEnteredDelegate ThreeOrMoreCharactersEntered; + + + public TextBox TextBox => TbValue; + public Label Label => LblDescription; + + private void TbValue_OnTextChanged(object sender, TextChangedEventArgs e) + { + Value = TextBox.Text; + var value = TextBox.Text; + + if (string.IsNullOrEmpty(value)) + { + value = String.Empty; + } + + CharactersEnteredCount?.Invoke(value.Length); + + if (value.Length >= 3) + { + ThreeOrMoreCharactersEntered?.Invoke(value); + } + + } + } +} diff --git a/tabler.wpf/Controls/Helper_LogMessages.xaml b/tabler.wpf/Controls/Helper_LogMessages.xaml new file mode 100644 index 0000000..bc70e6a --- /dev/null +++ b/tabler.wpf/Controls/Helper_LogMessages.xaml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + Pause autoscrolling + Show timestamp + + + Show general + Show internal + Show error + + + + + + + + + diff --git a/tabler.wpf/Controls/Helper_LogMessages.xaml.cs b/tabler.wpf/Controls/Helper_LogMessages.xaml.cs new file mode 100644 index 0000000..7a0ee5a --- /dev/null +++ b/tabler.wpf/Controls/Helper_LogMessages.xaml.cs @@ -0,0 +1,176 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.Windows; +using System.Windows.Controls; +using tabler.Logic.Enums; +using tabler.wpf.Helper; + +namespace tabler.wpf.Controls +{ + /// + /// Interaction logic for Helper_LogMessages.xaml + /// + public partial class Helper_LogMessages : UserControl, ICloneable + { + public ObservableCollection LogData { get; set; } = new ObservableCollection(); + + private List _lstGeneral = new List(); + private List _lstInternal = new List(); + private List _lstError = new List(); + + public delegate void LogMessageWithTypeDelegate(string message, LogTypeEnum logType); + + public event LogMessageWithTypeDelegate LogMessageWithTypeArrived; + + public void FireLogMessageWithTyperArivedEvent(string message, LogTypeEnum logType) + { + LogMessageWithTypeArrived?.Invoke(message, logType); + } + + public Helper_LogMessages() + { + InitializeComponent(); + } + + public void AddMessage(string message, LogTypeEnum logtype) + { + FireLogMessageWithTyperArivedEvent(message, logtype); + var row = new LogRow { DateTime = DateTime.Now, Message = message }; + + //if logging seem to be a problem, just make this asynch + Dispatcher.InvokeAsync(() => + { + AddMessage(row, logtype); + }); + + } + + private void AddMessage(LogRow row, LogTypeEnum logtype) + { + switch (logtype) + { + case LogTypeEnum.General: + _lstGeneral.Add(row); + if (cbShowGeneral.IsChecked.Value == false) + { + return; + } + + break; + case LogTypeEnum.Error: + _lstError.Add( row); + if (cbShowError.IsChecked.Value == false) + { + return; + } + break; + case LogTypeEnum.Internal: + _lstInternal.Add( row); + if (cbShowInternal.IsChecked.Value == false) + { + return; + } + break; + default: + throw new ArgumentOutOfRangeException(nameof(logtype), logtype, null); + } + + if (CbPauseScrolling.IsChecked.Value == false) + { + AddMessageToGrid(row); + } + + + } + + private void CbPauseScrollingGeneral_OnChecked(object sender, RoutedEventArgs e) + { + if (CbPauseScrolling.IsChecked.Value == false) + { + UpdateAllogs(); + } + } + + public class LogRow + { + public DateTime DateTime { get; set; } + public string Message { get; set; } + } + + private void UpdateLogsShowing(object sender, RoutedEventArgs e) + { + UpdateAllogs(); + + } + + public void UpdateAllogs() + { + var toShow = new List(); + + if (cbShowGeneral == null) + { + return; + } + + if (cbShowGeneral.IsChecked.Value) + { + toShow.AddRange(_lstGeneral); + } + if (cbShowInternal.IsChecked.Value) + { + toShow.AddRange(_lstInternal); + } + if (cbShowError.IsChecked.Value) + { + toShow.AddRange(_lstError); + } + + LogData.Clear(); + + toShow.OrderByDescending(x => x.DateTime).ToList().ForEach(AddMessageToGrid); + } + + private void AddMessageToGrid(LogRow logRow) + { + if (CbShowDatetime.IsChecked.Value) + { + LogData.Insert(0,new LogRow() {Message = $"{logRow.DateTime.GetDateTimeString_yyyyMMddhhmmss()}: {logRow.Message}"}); + } + else + { + LogData.Insert(0,logRow); + } + } + + public object Clone() + { + var clone = new Helper_LogMessages { _lstError = this._lstError.ToList(), _lstGeneral = _lstGeneral.ToList(), _lstInternal = _lstInternal.ToList() }; + this.LogMessageWithTypeArrived += clone.AddMessage; + + return clone; + + } + + private void CbShowDatetime_OnChecked(object sender, RoutedEventArgs e) + { + UpdateAllogs(); + } + + private void ResetAllMessages() + { + _lstInternal.Clear(); + _lstError.Clear(); + _lstGeneral.Clear(); + UpdateAllogs(); + + } + + private void BtnResetAllMessages_OnClick(object sender, RoutedEventArgs e) + { + ResetAllMessages(); + } + + } +} diff --git a/tabler.wpf/Controls/Helper_ProgressBar.xaml b/tabler.wpf/Controls/Helper_ProgressBar.xaml new file mode 100644 index 0000000..9d3cb01 --- /dev/null +++ b/tabler.wpf/Controls/Helper_ProgressBar.xaml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tabler.wpf/Controls/Helper_ProgressBar.xaml.cs b/tabler.wpf/Controls/Helper_ProgressBar.xaml.cs new file mode 100644 index 0000000..ba61e08 --- /dev/null +++ b/tabler.wpf/Controls/Helper_ProgressBar.xaml.cs @@ -0,0 +1,277 @@ +using System; +using System.Timers; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Threading; +using tabler.Logic.Helper; +using tabler.wpf.Helper; + +namespace tabler.wpf.Controls +{ + + /// + /// Interaction logic for Helper_ProgressBar.xaml + /// + public partial class Helper_ProgressBar : UserControl, IProgressBarControl + { + public Helper_ProgressBar() + { + InitializeComponent(); + _updateTimer = new Timer {Interval = 1000}; + _updateTimer.AutoReset = false; + _updateTimer.Start(); + _updateTimer.Elapsed += (sender, args) => + { + _updateTimer.Stop(); + UpdateProgressName(); + _updateTimer.Start(); + }; + this.Visibility = Visibility.Collapsed; + } + + private Timer _updateTimer; + + private string Name { get; set; } + + + public delegate void OperationNameChangedDelegate(string value); + + public event OperationNameChangedDelegate OperationNameChanged; + + private void FireOperationNameChangedEvent(string value) + { + OperationNameChanged?.Invoke(value); + } + + + public void SetOperationName(string name) + { + Name = name; + FireOperationNameChangedEvent(name); + } + + private int _currentValue; + private int _currentMax; + private int _currentMin; + + private void UpdateProgressName() + { + if (Dispatcher.HasShutdownStarted) + { + return; + } + + try + { + Dispatcher.BeginInvoke(() => + { + try + { + //if not started or already done + if (_currentValue <= 0 || _currentValue >= _currentMax) + { + if (Visibility != Visibility.Collapsed) + { + Visibility = Visibility.Collapsed; + } + return ; + } + + //make visible + if (Visibility != Visibility.Visible) + { + Visibility = Visibility.Visible; + } + + if (_currentMax != pbCurrentProgress.Maximum) + { + pbCurrentProgress.Maximum = _currentMax; + } + + if (_currentMin != pbCurrentProgress.Minimum) + { + pbCurrentProgress.Minimum = _currentMin; + } + + pbCurrentProgress.Value = _currentValue; + + try + { + if (_currentMax == 0) + { + lblProgressStatusMessage.Content = Name; + return; + } + + var percent = (int) ((int) (100*_currentValue)/_currentMax); + lblProgressStatusMessage.Content = Name + $" {((int) _currentValue).ToString()}/{((int) _currentMax) + " -> " + percent.ToString() + "%"}"; + } + catch (Exception ex) + { + Logger.LogError($"{nameof(Helper_ProgressBar)}.{nameof(UpdateProgressName)} Exception: {ex}"); + } + } + catch (Exception ex) + { + Logger.LogError($"{nameof(Helper_ProgressBar)}.{nameof(UpdateProgressName)} Exception: {ex}"); + } + },DispatcherPriority.Background); + + } + catch (Exception ex) + { + Logger.LogError($"{nameof(Helper_ProgressBar)}.{nameof(UpdateProgressName)} Exception: {ex}"); + } + + + } + + public void Reset() + { + try + { + _currentValue = 0; + } + catch (Exception ex) + { + Logger.LogError($"{nameof(Helper_ProgressBar)}.{nameof(Reset)} Exception: {ex}"); + } + + } + + + public delegate void ValueIncreasedDelegate(int value); + + public event ValueIncreasedDelegate ValueIncreased; + + private void FireValueIncreasedEvent(int value) + { + ValueIncreased?.Invoke(value); + } + + + public delegate void MaxChangedDelegate(int value, bool doReset); + + public event MaxChangedDelegate MaxChanged; + + private void FireMaxChangedEvent(int value, bool doReset) + { + MaxChanged?.Invoke(value, doReset); + } + + public void SetMax(int max, bool doReset) + { + try + { + FireMaxChangedEvent(max, doReset); + if (doReset) + { + Reset(); + } + + _currentMax = max; + } + catch (Exception ex) + { + Logger.LogError($"{nameof(Helper_ProgressBar)}.{nameof(SetMax)} Exception: {ex}"); + } + } + + private object _incLock = new object(); + + public void Increase(int value) + { + try + { + lock (_incLock) + { + if (_currentValue + value < _currentMin) + { + FireValueIncreasedEvent(_currentMin); + _currentValue = _currentMin; + return; + } + + if (_currentValue + value > _currentMax) + { + FireValueIncreasedEvent(_currentMax); + _currentValue = _currentMax; + return; + } + _currentValue += value; + FireValueIncreasedEvent(_currentValue); + } + } + catch (Exception ex) + { + Logger.LogError($"{nameof(Helper_ProgressBar)}.{nameof(Increase)} Exception: {ex}"); + } + } + + public void Set(int value) + { + try + { + lock (_incLock) + { + if (value < _currentMin) + { + FireValueIncreasedEvent(_currentMin); + _currentValue = _currentMin; + return; + } + + if (value > _currentMax) + { + FireValueIncreasedEvent(_currentMax); + _currentValue = _currentMax; + return; + } + _currentValue = value; + FireValueIncreasedEvent(_currentValue); + } + } + catch (Exception ex) + { + Logger.LogError($"{nameof(Helper_ProgressBar)}.{nameof(Increase)} Exception: {ex}"); + } + } + + + public void Increase() + { + Increase(1); + } + + public void Decrease(int value) + { + Increase(-value); + } + + public void Decrease() + { + Increase(-1); + } + + #region Implementation of IProgress + + /// + /// Values from 0-100 for whatever max is set currently + /// + /// + public void Report(double value) + { + try + { + var current = _currentMax * (value/100); + Set((int)current); + } + catch (Exception ex) + { + Logger.LogError($"{nameof(Helper_ProgressBar)}.{nameof(Report)} Report Exception: {ex}"); + } + } + + #endregion + } +} diff --git a/tabler.wpf/Controls/Helper_TabControlExtended.cs b/tabler.wpf/Controls/Helper_TabControlExtended.cs new file mode 100644 index 0000000..99552ba --- /dev/null +++ b/tabler.wpf/Controls/Helper_TabControlExtended.cs @@ -0,0 +1,35 @@ +using System.Windows.Controls; + +namespace tabler.wpf.Controls +{ + public class Helper_TabControlExtended : TabControl + { + public Helper_TabControlExtended() + { + + this.SelectionChanged += (sender, args) => + { + + if (this.SelectedItem == null) + { + return; + } + if (_lastSelectedTabItem == this.SelectedItem) + { + return; + } + + _lastSelectedTabItem = this.SelectedItem; + + if (_lastSelectedTabItem is Helper_TabItemExtended) + { + var ti = (Helper_TabItemExtended)_lastSelectedTabItem; + ti.FireTabItemSelectedEvent(); + } + }; + } + + private object _lastSelectedTabItem = null; + + } +} diff --git a/tabler.wpf/Controls/Helper_TabItemExtended.cs b/tabler.wpf/Controls/Helper_TabItemExtended.cs new file mode 100644 index 0000000..f2f8b5c --- /dev/null +++ b/tabler.wpf/Controls/Helper_TabItemExtended.cs @@ -0,0 +1,18 @@ +using System.Windows.Controls; + +namespace tabler.wpf.Controls +{ + public class Helper_TabItemExtended:TabItem + { + public delegate void TabItemSelectedDelegate(); + + public event TabItemSelectedDelegate TabItemSelected; + + public void FireTabItemSelectedEvent() + { + TabItemSelected?.Invoke(); + } + + + } +} diff --git a/tabler.wpf/Controls/ItemSelectControl.xaml b/tabler.wpf/Controls/ItemSelectControl.xaml new file mode 100644 index 0000000..50ab8a2 --- /dev/null +++ b/tabler.wpf/Controls/ItemSelectControl.xaml @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/tabler.wpf/Controls/ItemSelectControl.xaml.cs b/tabler.wpf/Controls/ItemSelectControl.xaml.cs new file mode 100644 index 0000000..32efab3 --- /dev/null +++ b/tabler.wpf/Controls/ItemSelectControl.xaml.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; +using tabler.Logic.Classes; + +namespace tabler.wpf.Controls +{ + /// + /// Interaction logic for LanguageSelect.xaml + /// + public partial class ItemSelectControl : UserControl + { + + + public ItemSelectControl() + { + InitializeComponent(); + } + + public void SetItemsAndSelectedItems(List items) + { + lbMain.ItemsSource = null; + lbMain.ItemsSource = items; + + + } + + } +} diff --git a/tabler.wpf/Controls/LogMessages_Window.xaml b/tabler.wpf/Controls/LogMessages_Window.xaml new file mode 100644 index 0000000..1edf720 --- /dev/null +++ b/tabler.wpf/Controls/LogMessages_Window.xaml @@ -0,0 +1,20 @@ + + + + + + + + + + + + diff --git a/tabler.wpf/Controls/LogMessages_Window.xaml.cs b/tabler.wpf/Controls/LogMessages_Window.xaml.cs new file mode 100644 index 0000000..52ccfab --- /dev/null +++ b/tabler.wpf/Controls/LogMessages_Window.xaml.cs @@ -0,0 +1,30 @@ +using System.Windows; +using System.Windows.Controls; + +namespace tabler.wpf.Controls +{ + /// + /// Interaction logic for LogMessages_Window.xaml + /// + public partial class LogMessages_Window : Window + { + public LogMessages_Window() + { + InitializeComponent(); + } + + public LogMessages_Window(Helper_LogMessages control) + { + InitializeComponent(); + + SetMainControl(control); + control.UpdateAllogs(); + } + + private void SetMainControl(Control control) + { + grdMainContent.Children.Clear(); + grdMainContent.Children.Add(control); + } + } +} diff --git a/tabler.wpf/Controls/TranslationFileOverviewControl.xaml b/tabler.wpf/Controls/TranslationFileOverviewControl.xaml new file mode 100644 index 0000000..a33ead9 --- /dev/null +++ b/tabler.wpf/Controls/TranslationFileOverviewControl.xaml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tabler.wpf/Controls/TranslationFileOverviewControl.xaml.cs b/tabler.wpf/Controls/TranslationFileOverviewControl.xaml.cs new file mode 100644 index 0000000..fe834f9 --- /dev/null +++ b/tabler.wpf/Controls/TranslationFileOverviewControl.xaml.cs @@ -0,0 +1,69 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; +using tabler.Logic.Helper; + +namespace tabler.wpf.Controls +{ + /// + /// Interaction logic for LanguageOverviewControl.xaml + /// + public partial class TranslationFileOverviewControl : UserControl + { + public TranslationFileOverviewControl() + { + InitializeComponent(); + + } + + public List Directorys { get; set; } = new List(); + + public void LoadDirectory(DirectoryInfo di ) + { + if (!DirectoryAlreadyAdded(di)) + { + Directorys.Add(di); + } + else + { + Logger.LogError($"Files of folder: {di.FullName} already added."); + return; + } + + var files = di.GetFiles("*stringtable*.xml*", SearchOption.AllDirectories); + + tc_Main.Items.Clear(); + + foreach (var file in files) + { + var languageControl = new TranslationFileSingleControl(file); + var tiExtended = new Helper_TabItemExtended() { Header = $"{file.Directory.Name}\\{file.Name}", Content = languageControl }; + tiExtended.TabItemSelected += languageControl.Load; + + tc_Main.Items.Add(tiExtended); + } + + } + + private bool DirectoryAlreadyAdded(DirectoryInfo di ) + { + ///todo check for subfolders + return false; + + + } + + } +} diff --git a/tabler.wpf/Controls/TranslationFileSingleControl.xaml b/tabler.wpf/Controls/TranslationFileSingleControl.xaml new file mode 100644 index 0000000..07c738f --- /dev/null +++ b/tabler.wpf/Controls/TranslationFileSingleControl.xaml @@ -0,0 +1,143 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Group by Project + Group by Status + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tabler.wpf/Controls/TranslationFileSingleControl.xaml.cs b/tabler.wpf/Controls/TranslationFileSingleControl.xaml.cs new file mode 100644 index 0000000..a98ffdd --- /dev/null +++ b/tabler.wpf/Controls/TranslationFileSingleControl.xaml.cs @@ -0,0 +1,429 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; +using tabler.Logic.Classes; +using tabler.Logic.Enums; +using tabler.Logic.Helper; +using tabler.wpf.Helper; +using Key = tabler.Logic.Classes.Key; + +namespace tabler.wpf.Controls +{ + /// + /// Interaction logic for SingleLanguageTranslationControl.xaml + /// + public partial class TranslationFileSingleControl : UserControl + { + private CollectionViewSource _collViewSource = new CollectionViewSource(); + private class KeyCollection : ObservableCollection + {} + + private KeyCollection _keyCollection = new KeyCollection(); + public bool AlreadyLoaded { get; set; } = false; + public Stringtable StringTable { get; set; } + public FileInfo CurrentFile { get; set; } + public List Header { get; set; } + private bool _filteringDiabled = false; + + private PropertyGroupDescription _groupDescriptionPackageName = new PropertyGroupDescription("PackageName"); + private PropertyGroupDescription _groupDescriptionIsComplete = new PropertyGroupDescription("IsCompleteName"); + + #region CTOR and Load data + public TranslationFileSingleControl(FileInfo file) : this() + { + CurrentFile = file; + } + + public TranslationFileSingleControl() + { + InitializeComponent(); + + _collViewSource.Source = _keyCollection; + _collViewSource.Filter += _collViewSource_Filter; + + if (_collViewSource.View.CanGroup == true) + { + _collViewSource.View.GroupDescriptions.Clear(); + _collViewSource.View.GroupDescriptions.Add(_groupDescriptionPackageName); + _collViewSource.View.GroupDescriptions.Add(_groupDescriptionIsComplete); + } + + dge_Main.ItemsSource = _collViewSource.View; + + var menu = new MenuItem { Header = "Copy complete row(s)" }; + menu.Click += copyCompleteRow; + this.dge_Main.ContextMenu.Items.Add(menu); + + menu = new MenuItem { Header = "Paste complete row(s)" }; + menu.Click += pasteCompleteRowBelowCurrentRow; ; + this.dge_Main.ContextMenu.Items.Add(menu); + + dge_Main.AddingNewItem += Dge_Main_AddingNewItem; + + } + + private void Dge_Main_AddingNewItem(object sender, AddingNewItemEventArgs e) + { + e.NewItem = new Key(); + } + + public void Load() + { + if (AlreadyLoaded) + { + return; + } + + try + { + AlreadyLoaded = true; + dge_Main.Columns.Clear(); + + StringTable = StringtableHelper.ParseStringtable(CurrentFile); + + SetHeader(); + UpdateIsCompleteFlag(); + + foreach (var item in StringTable.Project.Packages.SelectMany(x => x.Keys).ToList()) + { + _keyCollection.Add(item); + } + } + catch (Exception ex) + { + Logger.LogEx(ex); + } + } + + + #endregion + + #region DataGridEvents + + private void _collViewSource_Filter(object sender, FilterEventArgs e) + { + Key t = e.Item as Key; + + if (t != null) + { + if (string.IsNullOrEmpty(this.tbe_FilterAndSearchAll.Value) && string.IsNullOrEmpty(this.tbe_FilterAndSearchInId.Value)) + { + e.Accepted = true; + } + else + { + if (!string.IsNullOrEmpty(this.tbe_FilterAndSearchAll.Value)) + { + if (t.ContainsText(this.tbe_FilterAndSearchAll.Value, false, true)) + { + e.Accepted = true; + } + else + { + e.Accepted = false; + } + } + if (!string.IsNullOrEmpty(this.tbe_FilterAndSearchInId.Value)) + { + if (t.ContainsText(this.tbe_FilterAndSearchInId.Value, true, true)) + { + e.Accepted = true; + } + else + { + e.Accepted = false; + } + } + + } + } + } + + private void tbe_FilterAndSearchInId_changed(int value) + { + if (_filteringDiabled) + { + return; + } + _filteringDiabled = true; + tbe_FilterAndSearchAll.Value = ""; + _filteringDiabled = false; + _collViewSource.View.Refresh(); + } + + private void tbe_FilterAndSearchAll_3CharsAdded(int value) + { + if (_filteringDiabled) + { + return; + } + _filteringDiabled = true; + tbe_FilterAndSearchInId.Value = ""; + _filteringDiabled = false; + _collViewSource.View.Refresh(); + } + + private void cbGroupByProject_click(object sender, RoutedEventArgs e) + { + var existsAlready = this._collViewSource.View.GroupDescriptions.Any(x => x == _groupDescriptionPackageName); + + if (cbGroupByProject.IsChecked.GetValueOrDefault()) + { + if (existsAlready) + { + return; + } + + this._collViewSource.View.GroupDescriptions.Insert(0, _groupDescriptionPackageName); + } + else + { + if (existsAlready) + { + this._collViewSource.View.GroupDescriptions.Remove(_groupDescriptionPackageName); + } + } + + _collViewSource.View.Refresh(); + + } + + private void cbGroupByStatus_click(object sender, RoutedEventArgs e) + { + var existsAlready = this._collViewSource.View.GroupDescriptions.Any(x => x == _groupDescriptionIsComplete); + + if (cbGroupByStatus.IsChecked.GetValueOrDefault()) + { + if (existsAlready) + { + return; + } + + this._collViewSource.View.GroupDescriptions.Add( _groupDescriptionIsComplete); + } + else + { + if (existsAlready) + { + this._collViewSource.View.GroupDescriptions.Remove(_groupDescriptionIsComplete); + } + } + + _collViewSource.View.Refresh(); + } + + #endregion + + #region ContextMenu actions + private void pasteCompleteRowBelowCurrentRow(object sender, RoutedEventArgs e) + { + var keys = ClipBoardHelper.GetKeyObjectsFromClipboard(); + if (keys != null && keys.Any()) + { + StringTable.Project.Packages.FirstOrDefault().Keys.AddRange(keys); + } + } + + private void copyCompleteRow(object sender, RoutedEventArgs e) + { + var b = _collViewSource.IsLiveGrouping; + + var keys = this.dge_Main.SelectedCells.Select(x => x.Item).OfType().Distinct().ToList(); + if (keys != null && keys.Any()) + { + ClipBoardHelper.AddKeyObjectsToClipboard(keys); + } + } + + #endregion + + #region Buttons + + private void btnSave_click(object sender, RoutedEventArgs e) + { + if (CurrentFile == null) + { + return; + } + try + { + StringTable.HasChanges = true; + StringtableHelper.SaveStringTableFile(CurrentFile, StringTable, Header); + } + catch (Exception ex) + { + Logger.LogEx(ex); + } + } + + private void btnReloadFile_click(object sender, RoutedEventArgs e) + { + AlreadyLoaded = false; + Load(); + } + + private void btnSelectLanguages_click(object sender, RoutedEventArgs e) + { + try + { + var ctrl = new ItemSelectControl(); + + ctrl.SetItemsAndSelectedItems(Header); + ctrl.ShowInNewWindow(true, this, "Select Languages"); + + SynchVisibleHeader(); + UpdateIsCompleteFlag(); + _collViewSource.View.Refresh(); + } + catch (Exception ex) + { + Logger.LogEx(ex); + } + + } + + #endregion + + #region private methods + + private void SetHeader() + { + var initHeader = TranslationHelper.GetHeaders(StringTable); + + var allItems = new List(); + + foreach (var languageName in Enum.GetNames(typeof(Languages))) + { + allItems.Add(new ItemSelected() { DisplayName = languageName, IsSelected = initHeader.Any(x => x == languageName), Key = languageName }); + } + Header = allItems; + + AddColumns(new ItemSelected() { IsSelected = true, DisplayName = "IsComplete", Key = "IsComplete" }); + AddColumns(new ItemSelected() { IsSelected = true, DisplayName = "Id", Key = "Id" }); + AddColumns(new ItemSelected() { IsSelected = true, DisplayName = "Project", Key = "Project" }); + + foreach (var header in allItems) + { + AddColumns(header); + } + } + + private void AddColumns(ItemSelected header) + { + var binding = new Binding(header.Key); + binding.Mode = BindingMode.TwoWay; + var dgNew = new DataGridTextColumn + { + // bind to a dictionary property + Binding = binding,//new Binding("Custom[" + name + "]"), + Header = header.DisplayName, + Width = 100, + Visibility = header.IsSelected ? Visibility.Visible : Visibility.Collapsed, + }; + + //dgNew.PastingCellClipboardContent += DgNew_PastingCellClipboardContent; + //dgNew.CopyingCellClipboardContent += DgNew_CopyingCellClipboardContent; + + dge_Main.Columns.Add(dgNew); + } + + private void UpdateIsCompleteFlag() + { + //foreach (var item in _keyCollection) + //{ + // item.UpdateIsComplete(Header.Where(x=> x.IsSelected).Select(x=> x.Key).ToList()); + //} + + var selectedHeader = Header.Where(x => x.IsSelected).Select(x => x.Key).ToList(); + + foreach (var item in StringTable.Project.Packages.SelectMany(x => x.Keys)) + { + item.UpdateIsComplete(selectedHeader); + } + + } + + private void SynchVisibleHeader() + { + try + { + foreach (var column in dge_Main.Columns.OfType()) + { + var header = Header.FirstOrDefault(x => x.Key == column.Header.ToString()); + + if (header == null) + { + continue; + } + + column.Visibility = header.IsSelected ? Visibility.Visible : Visibility.Collapsed; + } + } + catch (Exception ex) + { + Logger.LogEx(ex); + } + + } + + #endregion + + + + + + + //private void DgNew_CopyingCellClipboardContent(object sender, DataGridCellClipboardEventArgs e) + //{ + + // var i = e.Item; + // var k = i as Logic.Classes.Key; + // if (k != null) + // { + // ClipBoardHelper.AddKeyObjectToClipboard(k); + // } + //} + + //private void DgNew_PastingCellClipboardContent(object sender, DataGridCellClipboardEventArgs e) + //{ + // try + // { + // var k = ClipBoardHelper.GetKeyObjectFromClipboard(); + // if (k != null) + // { + + // } + + // //if (!Clipboard.ContainsText()) + // //{ + // // return; + // //} + + // //var data = Clipboard.GetData(DataFormats.UnicodeText); + + // //var datao = Clipboard.GetDataObject(); + // } + // catch (Exception ex) + // { + // Logger.LogEx(ex); + // } + + + //} + + + } +} diff --git a/tabler.wpf/ExampleData/proj1/stringtable.xml b/tabler.wpf/ExampleData/proj1/stringtable.xml new file mode 100644 index 0000000..d11569f --- /dev/null +++ b/tabler.wpf/ExampleData/proj1/stringtable.xml @@ -0,0 +1,219 @@ + + + + + TEST + Windinformationen anzeigen + Afficher les info sur le vent + Mostra indicazioni del vento + Mostrar información del viento + Mostrar Informação do Vento + Pokaż inf. o wietrze + Zobrazit informace o větru + Széladatok mutatása + Показать информацию о ветре + + + Show Protractor + Winkelmesser anzeigen + Afficher le rapporteur + Mostra il rapportatore + Mostrar transportador + Mostrar Transferidor + Pokaż kątomierz + Zobrazit úhloměr + Szögmérő mutatása + Показать транспортир + + + Advanced Ballistics + Erweiterte Ballistik + Balística avanzada + Balística avançada + Zaawansowana balistyka + Pokročilá balistika + + + Advanced Ballistics + Erweiterte Ballistik + Balística avanzada + Balística avançada + Zaawansowana balistyka + Pokročilá balistika + + + Enables advanced ballistics + Aktiviert die erweiterte Ballistik + Activa la balística avanzada + Ativa balística avançada + Aktywuje zaawansowaną balistykę + Aktivuje pokročilou balistiku + + + Enabled For Snipers + Für Scharfschützen aktiviert + Activada para francotiradores + Ativar para caçadores + Akt. dla snajperów + Povoleno pro odstřelovače + + + Enables advanced ballistics for non local snipers (when using high power optics) + Aktiviert die erweiterte Ballistik für nicht lokale Scharfschützen (bei Benutzung von Optiken mit starker Vergrößerung) + Activa la balística avanzada para francotiradores no locales (cuando se usa una mira telescópica) + Ativa balística avançada para caçadores não locais (quando usando miras telescópicas) + Aktywuje zaawansowaną balistykę dla nielokalnych snajperów (kiedy używają optyki) + Aktivuje pokročilou balistiku pro nelokální odstřelovače (když používá výkonnou optiku) + + + Enabled For Group Members + Für Gruppenmitglieder aktiviert + Activada para miembros de grupo + Ativada para membros do grupo + Akt. dla czł. grupy + Povoleno pro členy skupiny + + + Enables advanced ballistics for non local group members + Aktiviert die erweiterte Ballistik für nicht lokale Gruppenmitglieder + Activada la balística avanzada para miembros de grupo no locales + Ativa balística avançada para membros de grupo não locais + Aktywuje zaawansowaną balistykę dla nielokalnych członków grupy + Aktivuje pokročilou balistiku pro nelokální členy skupiny + + + Enabled For Everyone + Für jeden aktiviert + Activada para todos + Ativada para todos + Akt. dla wszystkich + Povoleno pro všechny + + + Enables advanced ballistics for all non local players (enabling this may degrade performance during heavy firefights in multiplayer) + Aktiviert die erweiterte Ballistik für alle nicht lokalen Spieler (das Aktivieren dieser Funktion kann zur Beeinträchtigung des Spielerlebnisses im Multiplayer führen) + Activada la balística avanzada para todos los jugadores no locales (activarlo puede degradar el rendimiento durante grandes tiroteos en multijugador). + Ativa balística avançada para todos os jogadores não locais (ativando isso pode degradar a performance durante troca de tiros intensas no multiplayer) + Aktywuje zaawansowaną balistykę dla wszystkich nielokalnych graczy (aktywacja tej opcji może spodowować spory spadek wydajności podczas ciężkiej wymiany ognia) + Aktivovat pokročilou balistiku pro všechny nelokální hráče (aktivace této možnosti způsobuje pokles snímu za sekundu během těžké přestřelky v multiplayeru) + + + Always Enabled For Group Members + Für Gruppenmitglieder immer aktiviert + Siempre activada para miembros de grupo + Sempre ativada para membros do grupo + Zawsze akt. dla czł. grupy + Vždy povoleno pro členy skupiny + + + Always enables advanced ballistics when a group member fires + Aktiviert die erweiterte Ballistik immer, wenn ein Gruppenmitglied schießt + Activada la balística avanzada siempre cuando miembros de grupo disparan + Sempre ative balística avançada quando um membro do grupo disparar + Aktywuje zaawansowaną balistykę dla wszystkich członków grupy + Aktivuje pokročilou balistiku pro členy skupiny + + + Disabled In FullAuto Mode + Beim vollautomatischen Feuern deaktiviert + Desactivada en modo automático + Desabilitar no modo automático + Wył. podczas ognia auto. + Zakázáno v automatickém režimu střelby + + + Disables the advanced ballistics during full auto fire + Deaktiviert die erweiterte Ballistik beim vollautomatischen Feuern + Desactivada la balística avanzada durante el fuego automático + Desabilitar a balística avançada durante fogo automático + Dezaktywuje zaawansowaną balistykę podczas ognia automatycznego + Zákáže pokročilou balistiku během střelby v režimu automat + + + Enable Ammo Temperature Simulation + Simulation der Munitionstemperatur aktivieren + Activar simulación de temperatura de munición + Ativar simulação de temperatura de munição + Symulacja temp. amunicji + Povolit simulaci teploty munice + + + Muzzle velocity varies with ammo temperature + Munitionstemperatur hat Einfluss auf die Mündungsgeschwindigkeit + La velocidad de salida varía con la temperatura de la munición + A velocidade de saída varia com a temperatura da munição + Prędkość wylotowa pocisku jest zależna od temperatury amunicji + Úsťová rychlost je závislá na teplotě munice + + + Enable Barrel Length Simulation + Simulation der Lauflänge aktivieren + Habilitar la simulación de longitud del cañón + Ativar a simulação de comprimento do cano + Symulacja długości lufy + Povolit simulaci délky hlavně + + + Muzzle velocity varies with barrel length + Lauflänge beeinflusst Mündungsgeschwindigkeit + La velocidad de salidal varía con la longitud del cañón + A velocidade de saída caria com o comprimento do cano + Prędkość wylotowa pocisku jest zależna od długości lufy + Úsťová rychlost je závislá na délce hlavně + + + Enable Bullet Trace Effect + Geschossspureffekt aktivieren + Activar el efecto trazador de la bala + Ativa efeito traçante de projétil + Efekt smugi pocisku + Povolit efekt trasírek + + + Enables a bullet trace effect to high caliber bullets (only visible when looking through high power optics) + Aktiviere Geschossspureffekt für hohe Kaliber (bei Benutzung von Optiken mit starker Vergrößerung) + Activa el efecto trazador de la balas de gran calibre (solo visible cuando se mira a través de una mira telescópica) + Ativa o efeito traçante de projétil para projéteis de alto calibre (somente visível quando observado por miras telescópicas) + Aktywuje efekt smugi pocisku dla pocisków wysokokalibrowych (widoczne tylko podczas patrzenia przez optykę) + Aktivuje efekt trasírek z vysokokaliberních zbraní (viditelné pouze skrze výkonnou optiku) + + + Simulation Interval + Simulationsintervall + Intervalo de simulación + Intervalo da simulação + Interwał symulacji + Interval simulace + + + Defines the interval between every calculation step + Legt das Intervall zwischen den Berechnungsschritten fest + Define el intervalo entre cada cálculo + Define o intervalo entre cada cálculo + Określa interwał pomiędzy każdym krokiem kalkulacji + Určuje interval mezi každým výpočtem + + + Simulation Radius + Simulationsradius + Radio de simulación + Raio de simulação + Zasięg symulacji + Rozsah simulace + + + Defines the radius around the player (in meters) at which advanced ballistics are applied to projectiles + Gibt den Radius (in Metern) um den Spieler an, bei dem die erweiterte Ballistik auf Geschosse angewendet wird + Define el radio alrededor del jugador (en metros) en el cual se aplica la balística avanzada a los proyectiles + Define o raio ao redor do jogador (em metros) onde a balística avançada será aplicada aos projéteis + Określa obszar naokoło gracza (w metrach), na którym zaawansowana balistyka jest aplikowana dla pocisków + Určuje oblast kolem hráče (v metrech), kde je pokročilá balistika použita na projektil + + + + Este módulo permite que você ative cálculos de balística avançada, fazendo a trajetória do projétil levar em consideração coisas como temperatura do ar, pressão atmosférica, umidade, força de Coriolis, a gravidade, o modelo da arma no qual o disparo é realizado e o tipo de munição. Tudo isso acrescenta-se a um balística muito precisa. + Moduł ten pozwala aktywować zaawansowaną balistykę biorącą przy obliczeniach trajektorii lotu pocisku pod uwagę takie rzeczy jak temperatura powietrza, ciśnienie atmosferyczne, wilgotność powietrza, siły Coriolisa i Eotvosa, grawitację a także broń z jakiej wykonywany jest strzał oraz rodzaj amunicji. Wszystko to sprowadza się na bardzo dokładne odwzorowanie balistyki. + Tento modul umožňuje aktivovat pokročilou balistiku, která vypočítává trajektorii kulky a bere do úvahy věci jako je teplota vzduchu, atmosférický tlak, vlhkost vzduchu, gravitaci, typ munice a zbraň, ze které je náboj vystřelen. To vše přispívá k velmi přesné balistice. + + + diff --git a/tabler.wpf/ExampleData/proj2/stringtable.xml b/tabler.wpf/ExampleData/proj2/stringtable.xml new file mode 100644 index 0000000..1d05beb --- /dev/null +++ b/tabler.wpf/ExampleData/proj2/stringtable.xml @@ -0,0 +1,219 @@ + + + + + Show Wind Info + Pokaż inf. o wietrze + Mostra indicazioni del vento + Показать информацию о ветре + Afficher les info sur le vent + Mostrar información del viento + Windinformationen anzeigen + Széladatok mutatása + Zobrazit informace o větru + Mostrar Informação do Vento + + + Show Protractor + Pokaż kątomierz + Mostra il rapportatore + Показать транспортир + Afficher le rapporteur + Mostrar transportador + Winkelmesser anzeigen + Szögmérő mutatása + Zobrazit úhloměr + Mostrar Transferidor + + + Advanced Ballistics + Zaawansowana balistyka + Balística avanzada + Erweiterte Ballistik + Pokročilá balistika + Balística avançada + + + Advanced Ballistics + Zaawansowana balistyka + Balística avanzada + Erweiterte Ballistik + Pokročilá balistika + Balística avançada + + + Enables advanced ballistics + Aktywuje zaawansowaną balistykę + Activa la balística avanzada + Aktiviert die erweiterte Ballistik + Aktivuje pokročilou balistiku + Ativa balística avançada + + + Enabled For Snipers + Activada para francotiradores + Akt. dla snajperów + Für Scharfschützen aktiviert + Povoleno pro odstřelovače + Ativar para caçadores + + + Enables advanced ballistics for non local snipers (when using high power optics) + Activa la balística avanzada para francotiradores no locales (cuando se usa una mira telescópica) + Aktywuje zaawansowaną balistykę dla nielokalnych snajperów (kiedy używają optyki) + Aktiviert die erweiterte Ballistik für nicht lokale Scharfschützen (bei Benutzung von Optiken mit starker Vergrößerung) + Aktivuje pokročilou balistiku pro nelokální odstřelovače (když používá výkonnou optiku) + Ativa balística avançada para caçadores não locais (quando usando miras telescópicas) + + + Enabled For Group Members + Activada para miembros de grupo + Akt. dla czł. grupy + Für Gruppenmitglieder aktiviert + Povoleno pro členy skupiny + Ativada para membros do grupo + + + Enables advanced ballistics for non local group members + Activada la balística avanzada para miembros de grupo no locales + Aktywuje zaawansowaną balistykę dla nielokalnych członków grupy + Aktiviert die erweiterte Ballistik für nicht lokale Gruppenmitglieder + Aktivuje pokročilou balistiku pro nelokální členy skupiny + Ativa balística avançada para membros de grupo não locais + + + Enabled For Everyone + Activada para todos + Akt. dla wszystkich + Für jeden aktiviert + Povoleno pro všechny + Ativada para todos + + + Enables advanced ballistics for all non local players (enabling this may degrade performance during heavy firefights in multiplayer) + Activada la balística avanzada para todos los jugadores no locales (activarlo puede degradar el rendimiento durante grandes tiroteos en multijugador). + Aktywuje zaawansowaną balistykę dla wszystkich nielokalnych graczy (aktywacja tej opcji może spodowować spory spadek wydajności podczas ciężkiej wymiany ognia) + Aktiviert die erweiterte Ballistik für alle nicht lokalen Spieler (das Aktivieren dieser Funktion kann zur Beeinträchtigung des Spielerlebnisses im Multiplayer führen) + Aktivovat pokročilou balistiku pro všechny nelokální hráče (aktivace této možnosti způsobuje pokles snímu za sekundu během těžké přestřelky v multiplayeru) + Ativa balística avançada para todos os jogadores não locais (ativando isso pode degradar a performance durante troca de tiros intensas no multiplayer) + + + Always Enabled For Group Members + Zawsze akt. dla czł. grupy + Siempre activada para miembros de grupo + Für Gruppenmitglieder immer aktiviert + Vždy povoleno pro členy skupiny + Sempre ativada para membros do grupo + + + Always enables advanced ballistics when a group member fires + Aktywuje zaawansowaną balistykę dla wszystkich członków grupy + Activada la balística avanzada siempre cuando miembros de grupo disparan + Aktiviert die erweiterte Ballistik immer, wenn ein Gruppenmitglied schießt + Aktivuje pokročilou balistiku pro členy skupiny + Sempre ative balística avançada quando um membro do grupo disparar + + + Disabled In FullAuto Mode + Wył. podczas ognia auto. + Desactivada en modo automático + Beim vollautomatischen Feuern deaktiviert + Zakázáno v automatickém režimu střelby + Desabilitar no modo automático + + + Disables the advanced ballistics during full auto fire + Dezaktywuje zaawansowaną balistykę podczas ognia automatycznego + Desactivada la balística avanzada durante el fuego automático + Deaktiviert die erweiterte Ballistik beim vollautomatischen Feuern + Zákáže pokročilou balistiku během střelby v režimu automat + Desabilitar a balística avançada durante fogo automático + + + Enable Ammo Temperature Simulation + Symulacja temp. amunicji + Activar simulación de temperatura de munición + Simulation der Munitionstemperatur aktivieren + Povolit simulaci teploty munice + Ativar simulação de temperatura de munição + + + Muzzle velocity varies with ammo temperature + Prędkość wylotowa pocisku jest zależna od temperatury amunicji + La velocidad de salida varía con la temperatura de la munición + Munitionstemperatur hat Einfluss auf die Mündungsgeschwindigkeit + Úsťová rychlost je závislá na teplotě munice + A velocidade de saída varia com a temperatura da munição + + + Enable Barrel Length Simulation + Symulacja długości lufy + Habilitar la simulación de longitud del cañón + Simulation der Lauflänge aktivieren + Povolit simulaci délky hlavně + Ativar a simulação de comprimento do cano + + + Muzzle velocity varies with barrel length + Prędkość wylotowa pocisku jest zależna od długości lufy + La velocidad de salidal varía con la longitud del cañón + Lauflänge beeinflusst Mündungsgeschwindigkeit + Úsťová rychlost je závislá na délce hlavně + A velocidade de saída caria com o comprimento do cano + + + Enable Bullet Trace Effect + Efekt smugi pocisku + Activar el efecto trazador de la bala + Geschossspureffekt aktivieren + Povolit efekt trasírek + Ativa efeito traçante de projétil + + + Enables a bullet trace effect to high caliber bullets (only visible when looking through high power optics) + Aktywuje efekt smugi pocisku dla pocisków wysokokalibrowych (widoczne tylko podczas patrzenia przez optykę) + Activa el efecto trazador de la balas de gran calibre (solo visible cuando se mira a través de una mira telescópica) + Aktiviere Geschossspureffekt für hohe Kaliber (bei Benutzung von Optiken mit starker Vergrößerung) + Aktivuje efekt trasírek z vysokokaliberních zbraní (viditelné pouze skrze výkonnou optiku) + Ativa o efeito traçante de projétil para projéteis de alto calibre (somente visível quando observado por miras telescópicas) + + + Simulation Interval + Interwał symulacji + Intervalo de simulación + Simulationsintervall + Interval simulace + Intervalo da simulação + + + Defines the interval between every calculation step + Określa interwał pomiędzy każdym krokiem kalkulacji + Define el intervalo entre cada cálculo + Legt das Intervall zwischen den Berechnungsschritten fest + Určuje interval mezi každým výpočtem + Define o intervalo entre cada cálculo + + + Simulation Radius + Zasięg symulacji + Radio de simulación + Simulationsradius + Rozsah simulace + Raio de simulação + + + Defines the radius around the player (in meters) at which advanced ballistics are applied to projectiles + Określa obszar naokoło gracza (w metrach), na którym zaawansowana balistyka jest aplikowana dla pocisków + Define el radio alrededor del jugador (en metros) en el cual se aplica la balística avanzada a los proyectiles + Gibt den Radius (in Metern) um den Spieler an, bei dem die erweiterte Ballistik auf Geschosse angewendet wird + Určuje oblast kolem hráče (v metrech), kde je pokročilá balistika použita na projektil + Define o raio ao redor do jogador (em metros) onde a balística avançada será aplicada aos projéteis + + + + Moduł ten pozwala aktywować zaawansowaną balistykę biorącą przy obliczeniach trajektorii lotu pocisku pod uwagę takie rzeczy jak temperatura powietrza, ciśnienie atmosferyczne, wilgotność powietrza, siły Coriolisa i Eotvosa, grawitację a także broń z jakiej wykonywany jest strzał oraz rodzaj amunicji. Wszystko to sprowadza się na bardzo dokładne odwzorowanie balistyki. + Tento modul umožňuje aktivovat pokročilou balistiku, která vypočítává trajektorii kulky a bere do úvahy věci jako je teplota vzduchu, atmosférický tlak, vlhkost vzduchu, gravitaci, typ munice a zbraň, ze které je náboj vystřelen. To vše přispívá k velmi přesné balistice. + Este módulo permite que você ative cálculos de balística avançada, fazendo a trajetória do projétil levar em consideração coisas como temperatura do ar, pressão atmosférica, umidade, força de Coriolis, a gravidade, o modelo da arma no qual o disparo é realizado e o tipo de munição. Tudo isso acrescenta-se a um balística muito precisa. + + + \ No newline at end of file diff --git a/tabler.wpf/Helper/ClipBoardHelper.cs b/tabler.wpf/Helper/ClipBoardHelper.cs new file mode 100644 index 0000000..6c4aa84 --- /dev/null +++ b/tabler.wpf/Helper/ClipBoardHelper.cs @@ -0,0 +1,89 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Threading; +using tabler.Logic.Classes; +using tabler.Logic.Helper; + +namespace tabler.wpf.Helper +{ + public static class ClipBoardHelper + { + private static DataFormat GetDataFormatOfKey() + { + return DataFormats.GetDataFormat(typeof(List).FullName); + } + + public static void AddKeyObjectsToClipboard(List obj) + { + if (Thread.CurrentThread.GetApartmentState() != ApartmentState.STA) + { + Logger.LogInternal($"To access the clipboard, the thread must be STA!"); + return; + } + + try + { + var format = GetDataFormatOfKey(); + IDataObject dataObj = new DataObject(); + dataObj.SetData(format.Name, obj, false); + Clipboard.SetDataObject(dataObj, false); + Logger.LogGeneral($"Added to clipboard: {obj.Count} format: {format.Id} format.name:{format.Name}"); + } + catch (Exception ex) + { + Logger.LogEx(ex); + } + } + + public static void AddKeyObjectToClipboard(Key obj) + { + AddKeyObjectsToClipboard(new List { obj }); + } + + public static List GetKeyObjectsFromClipboard() + { + if (Thread.CurrentThread.GetApartmentState() != ApartmentState.STA) + { + Logger.LogInternal($"To access the clipboard, the thread must be STA!"); + return null; + } + List doc = null; + + try + { + var format = GetDataFormatOfKey(); + var dataObj = Clipboard.GetDataObject(); + Logger.LogGeneral($"Get from clipboard: format: {format.Id} format.name:{format.Name} :{Thread.CurrentThread.GetApartmentState()}"); + if (dataObj != null && dataObj.GetDataPresent(format.Name)) + { + var o = dataObj.GetData(format.Name); + doc = o as List; + Logger.LogGeneral($"Get key from clipboard SUCCESSS "); + } + else + { + Logger.LogGeneral($"Get key from clipboard failed :("); + } + + return doc; + } + catch (Exception ex) + { + Logger.LogEx(ex); + return null; + } + + } + + public static Key GetKeyObjectFromClipboard() + { + return GetKeyObjectsFromClipboard().FirstOrDefault(); + + } + } +} diff --git a/tabler.wpf/Helper/Converter/BoolInverter.cs b/tabler.wpf/Helper/Converter/BoolInverter.cs new file mode 100644 index 0000000..67de9a4 --- /dev/null +++ b/tabler.wpf/Helper/Converter/BoolInverter.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Data; + +namespace tabler.wpf.Controls.Converter +{ + public class BoolInverter : IValueConverter + { + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + if (value == null) + { + return true; + } + + return !(bool)value; + + + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + if (value == null) + { + return true; + } + return !(bool)value; + } + } +} diff --git a/tabler.wpf/Helper/Converter/BooleanNullableToBrushConverter.cs b/tabler.wpf/Helper/Converter/BooleanNullableToBrushConverter.cs new file mode 100644 index 0000000..601dcd4 --- /dev/null +++ b/tabler.wpf/Helper/Converter/BooleanNullableToBrushConverter.cs @@ -0,0 +1,96 @@ +using System; +using System.Globalization; +using System.Windows; +using System.Windows.Data; +using System.Windows.Markup; +using System.Windows.Media; +using tabler.Logic.Helper; + +namespace tabler.wpf.Controls.Converter +{ + public class BooleanNullableToBrushConverter : MarkupExtension, IValueConverter + + { + public static readonly IValueConverter Instance = new BooleanNullableToBrushConverter(); + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + try + { + bool? bValue = null; + if (value is bool) + { + bValue = (bool)value; + } + else + { + var ut = Nullable.GetUnderlyingType(targetType); + if (ut != null && ut == typeof(bool)) + { + bValue = (bool?)value; + } + else + { + var s = value as string; + if (s != null) + { + var valueString = s.ToLowerInvariant(); + if (valueString == "true") + { + bValue = true; + } + if (valueString == "false") + { + bValue = false; + } + } + else + { + return DependencyProperty.UnsetValue; + } + } + } + + if (!bValue.HasValue) + { + return DependencyProperty.UnsetValue; + } + + if (bValue.Value) + { + return new SolidColorBrush(Colors.ForestGreen); + } + return new SolidColorBrush(Colors.Orange); + } + catch (Exception ex) + { + Logger.LogError($"{nameof(BooleanToVisibilityConverter)}.{nameof(Convert)} Exception: {ex}"); + } + + return Visibility.Visible; + } + + /// + /// Convert Visibility to boolean + /// + /// + /// + /// + /// + /// + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + if (value is Visibility) + { + return (Visibility)value == Visibility.Visible; + } + else + { + return false; + } + } + public override object ProvideValue(IServiceProvider serviceProvider) + { + return this; + } + } +} diff --git a/tabler.wpf/Helper/Converter/BooleanToVisibilityConverter.cs b/tabler.wpf/Helper/Converter/BooleanToVisibilityConverter.cs new file mode 100644 index 0000000..9fed458 --- /dev/null +++ b/tabler.wpf/Helper/Converter/BooleanToVisibilityConverter.cs @@ -0,0 +1,62 @@ +using System; +using System.Globalization; +using System.Windows; +using System.Windows.Data; +using System.Windows.Markup; +using tabler.Logic.Helper; + +namespace tabler.wpf.Controls.Converter +{ + public class BooleanToVisibilityConverter : MarkupExtension, IValueConverter + + { + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + try + { + bool bValue = false; + if (value is bool) + { + bValue = (bool)value; + } + + if (parameter != null && (string)parameter == "true") + { + bValue = !bValue; + } + + return bValue ? Visibility.Visible : Visibility.Collapsed; + } + catch (Exception ex) + { + Logger.LogError($"{nameof(BooleanToVisibilityConverter)}.{nameof(Convert)} Exception: {ex}"); + } + + return Visibility.Visible; + } + + /// + /// Convert Visibility to boolean + /// + /// + /// + /// + /// + /// + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + if (value is Visibility) + { + return (Visibility)value == Visibility.Visible; + } + else + { + return false; + } + } + public override object ProvideValue(IServiceProvider serviceProvider) + { + return this; + } + } +} diff --git a/tabler.wpf/Helper/Converter/CompleteConverter.cs b/tabler.wpf/Helper/Converter/CompleteConverter.cs new file mode 100644 index 0000000..b9eb95f --- /dev/null +++ b/tabler.wpf/Helper/Converter/CompleteConverter.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Data; + +namespace tabler.wpf.Helper.Converter +{ + public class CompleteConverter : IValueConverter + { + // This converter changes the value of a Tasks Complete status from true/false to a string value of + // "Complete"/"Active" for use in the row group header. + public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) + { + bool complete = (bool)value; + if (complete) + return "Translation Complete"; + else + return "Translation unfinished"; + } + + public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) + { + string strComplete = (string)value; + if (strComplete == "Complete") + return true; + else + return false; + } + } +} diff --git a/tabler.wpf/Helper/Converter/DateTimeDateConverter.cs b/tabler.wpf/Helper/Converter/DateTimeDateConverter.cs new file mode 100644 index 0000000..8c85d12 --- /dev/null +++ b/tabler.wpf/Helper/Converter/DateTimeDateConverter.cs @@ -0,0 +1,33 @@ +using System; +using System.Globalization; +using System.Windows.Data; +using System.Windows.Markup; + +namespace tabler.wpf.Controls.Converter +{ + public class DateTimeDateConverter : MarkupExtension, IValueConverter + { + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + if (value == null) + { + return null; + } + return ((DateTime)value).Date.ToString("yyyyy-MM-dd"); + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + if (value == null) + { + return null; + } + return value; + } + + public override object ProvideValue(IServiceProvider serviceProvider) + { + return this; + } + } +} diff --git a/tabler.wpf/Helper/Converter/DateToStringConverter.cs b/tabler.wpf/Helper/Converter/DateToStringConverter.cs new file mode 100644 index 0000000..1ccb8a0 --- /dev/null +++ b/tabler.wpf/Helper/Converter/DateToStringConverter.cs @@ -0,0 +1,46 @@ +using System; +using System.Globalization; +using System.Windows.Data; +using System.Windows.Markup; +using tabler.wpf.Helper; + +namespace tabler.wpf.Controls.Converter +{ + public class DateToStringConverter : MarkupExtension, IValueConverter + + { + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + if (value is DateTime) + { + try + { + return ((DateTime)value).GetDateTimeString_yyyyMMddhhmmssms(); + } + catch (Exception) + { + return "error! DateToStringConverter value: " + value; + } + } + + return null; + } + + /// + /// Convert Visibility to boolean + /// + /// + /// + /// + /// + /// + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + return null; + } + public override object ProvideValue(IServiceProvider serviceProvider) + { + return this; + } + } +} diff --git a/tabler.wpf/Helper/Converter/DoubleToStringConverterNoScientific.cs b/tabler.wpf/Helper/Converter/DoubleToStringConverterNoScientific.cs new file mode 100644 index 0000000..e3ce046 --- /dev/null +++ b/tabler.wpf/Helper/Converter/DoubleToStringConverterNoScientific.cs @@ -0,0 +1,54 @@ +using System; +using System.Globalization; +using System.Windows.Data; +using System.Windows.Markup; + +namespace tabler.wpf.Controls.Converter +{ + public class DoubleToStringConverterNoScientific : MarkupExtension, IValueConverter + + { + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + if (value == null) + { + return string.Empty; + } + double valueDbl = 0; + + if (value is double) + { + valueDbl = (double)value; + } + if (value is int) + { + valueDbl = (int)value; + } + if (value is long) + { + valueDbl = (long)value; + } + + return valueDbl.ToString(".################"); + } + + /// + /// Convert Visibility to boolean + /// + /// + /// + /// + /// + /// + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + double change = 0; + double.TryParse((string)value, NumberStyles.Any, new NumberFormatInfo() { NumberDecimalSeparator = ",", PercentDecimalSeparator = ",", CurrencyDecimalSeparator = "," }, out change); + return change; + } + public override object ProvideValue(IServiceProvider serviceProvider) + { + return this; + } + } +} diff --git a/tabler.wpf/Helper/Converter/IsNullConverter.cs b/tabler.wpf/Helper/Converter/IsNullConverter.cs new file mode 100644 index 0000000..8de097b --- /dev/null +++ b/tabler.wpf/Helper/Converter/IsNullConverter.cs @@ -0,0 +1,37 @@ +using System; +using System.Globalization; +using System.Windows.Data; +using System.Windows.Markup; +namespace tabler.wpf.Controls.Converter +{ + public class LIsNullConverter : MarkupExtension, IValueConverter + { + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + + if (value == null) + { + return true; + } + + var isString = value is string; + + if (isString && string.IsNullOrEmpty(value.ToString())) + { + return true; + } + + return false; + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + return true; + } + + public override object ProvideValue(IServiceProvider serviceProvider) + { + return this; + } + } +} diff --git a/tabler.wpf/Helper/Converter/NegativeNumberToRedConverter.cs b/tabler.wpf/Helper/Converter/NegativeNumberToRedConverter.cs new file mode 100644 index 0000000..c23189b --- /dev/null +++ b/tabler.wpf/Helper/Converter/NegativeNumberToRedConverter.cs @@ -0,0 +1,72 @@ +using System; +using System.Drawing; +using System.Globalization; +using System.Windows; +using System.Windows.Data; +using System.Windows.Markup; +using System.Windows.Media; + +namespace tabler.wpf.Controls.Converter +{ + public class NegativeNumberToRedConverter : MarkupExtension, IValueConverter + + { + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + if (value == null) + { + return string.Empty; + } + double valueDbl = 0; + + if (value is double) + { + valueDbl = (double)value; + + } + if (value is int) + { + valueDbl = (int)value; + } + if (value is long) + { + valueDbl = (long)value; + } + + if (valueDbl == 0 ) + { + return DependencyProperty.UnsetValue; + } + + if (valueDbl > 0 ) + { + return Brushes.MediumSeaGreen; + } + + if (valueDbl < 0) + { + return Brushes.Orange; + } + + return null; + + } + + /// + /// Convert Visibility to boolean + /// + /// + /// + /// + /// + /// + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + return null; + } + public override object ProvideValue(IServiceProvider serviceProvider) + { + return this; + } + } +} diff --git a/tabler.wpf/Helper/Converter/StringToNumberConverter.cs b/tabler.wpf/Helper/Converter/StringToNumberConverter.cs new file mode 100644 index 0000000..2586ab9 --- /dev/null +++ b/tabler.wpf/Helper/Converter/StringToNumberConverter.cs @@ -0,0 +1,67 @@ +using System; +using System.Globalization; +using System.Windows; +using System.Windows.Data; +using System.Windows.Markup; + +namespace tabler.wpf.Controls.Converter +{ + public class StringToNumberConverter : MarkupExtension, IValueConverter + + { + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + if (value == null) + { + return string.Empty; + } + double valueDbl = 0; + + if (value is double) + { + valueDbl = (double)value; + } + if (value is int) + { + valueDbl = (int)value; + } + if (value is long) + { + valueDbl = (long)value; + } + + var s = value as string; + if (s != null) + { + if (double.TryParse(s, NumberStyles.Any, new NumberFormatInfo() {NumberDecimalSeparator = ",", PercentDecimalSeparator = ",", CurrencyDecimalSeparator = ","}, out valueDbl)) + {} + } + + if (valueDbl == 0) + { + return string.Empty; + return DependencyProperty.UnsetValue; + } + + return valueDbl; + + } + + /// + /// Convert Visibility to boolean + /// + /// + /// + /// + /// + /// + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + return null; + } + public override object ProvideValue(IServiceProvider serviceProvider) + { + return this; + } + } +} diff --git a/tabler.wpf/Helper/Converter/ValueToBrushConverter.cs b/tabler.wpf/Helper/Converter/ValueToBrushConverter.cs new file mode 100644 index 0000000..762876f --- /dev/null +++ b/tabler.wpf/Helper/Converter/ValueToBrushConverter.cs @@ -0,0 +1,79 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Markup; +using System.Windows.Media; +using tabler.Logic.Helper; + +namespace tabler.wpf.Helper.Converter +{ + public class ValueToBrushConverter : MarkupExtension, IValueConverter + + { + public static readonly IValueConverter Instance = new ValueToBrushConverter(); + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + try + { + var cell = value as DataGridCell; + if (cell == null) + { + //return DependencyProperty.UnsetValue; + return new SolidColorBrush(Colors.Orange); + } + + if (cell.Content == null) + { + // return DependencyProperty.UnsetValue; + return new SolidColorBrush(Colors.Beige); + + } + + var tb = cell.Content as TextBlock; + if (tb == null) + { + return DependencyProperty.UnsetValue; + //return new SolidColorBrush(Colors.Beige); + } + + if (!string.IsNullOrEmpty(tb.Text)) + { + return new SolidColorBrush(Colors.Green); + //return DependencyProperty.UnsetValue; + } + return new SolidColorBrush(Colors.YellowGreen); + // return DependencyProperty.UnsetValue; + + } + catch (Exception ex) + { + Logger.LogError($"{nameof(ValueToBrushConverter)}.{nameof(Convert)} Exception: {ex}"); + } + + return Visibility.Visible; + } + + /// + /// Convert Visibility to boolean + /// + /// + /// + /// + /// + /// + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + return false; + } + public override object ProvideValue(IServiceProvider serviceProvider) + { + return this; + } + } +} diff --git a/tabler.wpf/Helper/Converter/VisibilityToBooleanConverter.cs b/tabler.wpf/Helper/Converter/VisibilityToBooleanConverter.cs new file mode 100644 index 0000000..6382a08 --- /dev/null +++ b/tabler.wpf/Helper/Converter/VisibilityToBooleanConverter.cs @@ -0,0 +1,37 @@ +using System; +using System.Globalization; +using System.Windows; +using System.Windows.Data; +using System.Windows.Markup; + +namespace tabler.wpf.Controls.Converter +{ + public class VisibilityToBooleanConverter : MarkupExtension, IValueConverter + + { + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + if ((Visibility)value == Visibility.Visible) + { + return true; + } + + return false; + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + if ((bool)value) + { + return Visibility.Visible; + } + return Visibility.Collapsed; + + } + + public override object ProvideValue(IServiceProvider serviceProvider) + { + return this; + } + } +} diff --git a/tabler.wpf/Helper/ExtensionMethods.cs b/tabler.wpf/Helper/ExtensionMethods.cs new file mode 100644 index 0000000..2671662 --- /dev/null +++ b/tabler.wpf/Helper/ExtensionMethods.cs @@ -0,0 +1,624 @@ +using ICSharpCode.SharpZipLib.Core; +using ICSharpCode.SharpZipLib.Zip; +using Polenter.Serialization; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Globalization; +using System.IO; +using System.IO.Compression; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; + +namespace tabler.wpf.Helper +{ + public static class ExtensionMethods + { + #region Rounding numbers + + public static Double SafeRound(this Double value, int decimalPlaces) + { + return Math.Round(value, decimalPlaces); + } + + public static Double SafeRound(this Double value) + { + return Math.Round(value, 6); + } + + public static float SafeRound(this float value) + { + return (float)Math.Round(value, 6); + } + + public static float SafeRound(this float value, int decimalPlaces) + { + return (float)Math.Round(value, decimalPlaces); + } + + public static decimal SafeRound(this decimal value) + { + return Math.Round(value, 6); + } + + public static decimal SafeRound(this decimal value, int decimalPlaces) + { + return Math.Round(value, decimalPlaces); + } + + #endregion + public static String ToInvariantString(this Double value) + { + return value.ToString(CultureInfo.InvariantCulture); + } + + public static String ToInvariantString(this float value) + { + return value.ToString(CultureInfo.InvariantCulture); + } + + public static string GetDateTimeString_yyyyMMdd(this DateTime timestamp) + { + return timestamp.ToString("yyyy.MM.dd"); + } + + public static string GetDateTimeString_yyyyMMddHH(this DateTime timestamp) + { + return timestamp.ToString("yyyy.MM.dd HH"); + } + + public static string GetDateTimeString_yyyyMM(this DateTime timestamp) + { + return timestamp.ToString("yyyy.MM"); + } + + public static string GetDateTimeString_yyyyMMddhhmmssFtpReady(this DateTime timestamp) + { + return timestamp.ToString("yyyy_MM_dd_HH-mm-ss"); + } + + + public static string GetDateTimeString_ddMMyyyyhhmmss(this DateTime timestamp) + { + // 2016-05-19 15:16:17 + return timestamp.ToString("dd-MM-yyyy HH:mm:ss"); + } + + public static string GetDateTimeString_yyyyMMddhhmmssFileName(this DateTime timestamp) + { + return timestamp.ToString("yyyy.MM.dd_HH-mm-ss"); + } + + public static string GetDateTimeString_yyyyMMddhhmmssms(this DateTime timestamp) + { + return timestamp.ToString("yyyy.MM.dd HH:mm:ss:ffff"); + } + public static string GetDateTimeString_yyyyMMddhhmmss(this DateTime timestamp) + { + return timestamp.ToString("yyyy.MM.dd HH:mm:ss"); + } + + public static double ToDouble(this TextBox source, double defaultValue = 0) + { + double result = defaultValue; + + if (double.TryParse(source.Text, out result) == false) + { + result = defaultValue; + } + + return result; + } + + public static int ToInt(this TextBox source, int defaultValue = 0) + { + int result = defaultValue; + + if (int.TryParse(source.Text, out result) == false) + { + result = defaultValue; + } + + return result; + } + public static byte ToByte(this TextBox source, byte defaultValue = 0) + { + byte result = defaultValue; + + if (byte.TryParse(source.Text, out result) == false) + { + result = defaultValue; + } + + return result; + } + public static IEnumerable> Batch(this IEnumerable source, int batchSize) + { + using (var enumerator = source.GetEnumerator()) + while (enumerator.MoveNext()) + yield return YieldBatchElements(enumerator, batchSize - 1); + } + + private static IEnumerable YieldBatchElements( + IEnumerator source, int batchSize) + { + yield return source.Current; + for (int i = 0; i < batchSize && source.MoveNext(); i++) + yield return source.Current; + } + + + public static bool ExistsInString(this String value, + List searchValues, + List searchValuesNegative, + bool doOr, + bool doOrNegative, + ref List valuesThatMatched) + { + + var validRow = false; + + if (searchValues == null) + { + searchValues = new List(); + } + if (searchValuesNegative == null) + { + searchValuesNegative = new List(); + } + + //search positive + if (searchValues.Any() == false) + { + validRow = true; + } + else + { + if (doOr) + { + //OR + + foreach (string keyword in searchValues) + { + string temp = keyword.ToUpperInvariant(); + + if (value.Contains(temp)) + { + valuesThatMatched.Add(temp); + validRow = true; + //dont break here, beacuse maybe multiple filter are valid + //break; + } + } + + + + } + else + { + + //AND + foreach (string keyword in searchValues) + { + string temp = keyword.ToUpperInvariant(); + + validRow = true; + + if (value.Contains(temp) == false) + { + validRow = false; + break; + } + else + { + valuesThatMatched.Add(temp); + } + } + + + } + } + + + if (validRow == false) + { + return false; + } + + //SEARCH NEGATIVE + if (searchValuesNegative.Any() == false) + { + validRow = true; + } + else + { + if (doOrNegative) + { + //or neagtive + if (value.ContainsAny(searchValuesNegative)) + { + validRow = false; + } + } + else + { + //and negative + if (value.ContainsAll(searchValuesNegative)) + { + validRow = false; + } + } + + } + + return validRow; + } + + public static DateTime GetPreviousWorkDay(this DateTime date) + { + switch (date.DayOfWeek) + { + case DayOfWeek.Sunday: + return date.AddDays(-2); + case DayOfWeek.Monday: + return date.AddDays(-3); + default: + return date.AddDays(-1); + } + } + + + public static DateTime GetLastWeekday(this DateTime date, DayOfWeek weekDay) + { + DateTime lastDay = date.AddDays(-1); + while (lastDay.DayOfWeek != weekDay) + { + lastDay = lastDay.AddDays(-1); + } + return lastDay; + } + + public static DateTime GetNextWeekday(this DateTime date, DayOfWeek weekDay) + { + DateTime lastDay = date.AddDays(1); + while (lastDay.DayOfWeek != weekDay) + { + lastDay = lastDay.AddDays(1); + } + return lastDay; + } + + + + public static List GetSelectedBoundItems(this System.Windows.Controls.DataGrid dgv) + { + List result = null; + + dgv.Dispatcher.Invoke(() => + { + //check full rows + result = dgv.SelectedItems.OfType() + .Select(x => x.Item) + .OfType().Distinct().ToList(); + + + if (result.Any() == false) + { + //check in cells + result = dgv.SelectedCells.OfType() + .Select(x => x.Item) + .OfType().Distinct().ToList(); + } + }); + + return result; + } + + + public static string Compress(this string uncompressedString) + { + var compressedStream = new MemoryStream(); + var uncompressedStream = new MemoryStream(Encoding.UTF8.GetBytes(uncompressedString)); + + using (var compressorStream = new DeflateStream(compressedStream, CompressionMode.Compress, true)) + { + uncompressedStream.CopyTo(compressorStream); + } + + return Convert.ToBase64String(compressedStream.ToArray()); + } + + /// + /// Decompresses a deflate compressed, Base64 encoded string and returns an uncompressed string. + /// + /// String to decompress. + public static string Decompress(this string compressedString) + { + var decompressedStream = new MemoryStream(); + var compressedStream = new MemoryStream(Convert.FromBase64String(compressedString)); + + using (var decompressorStream = new DeflateStream(compressedStream, CompressionMode.Decompress)) + { + decompressorStream.CopyTo(decompressedStream); + } + + return Encoding.UTF8.GetString(decompressedStream.ToArray()); + } + + public static byte[] SerializeAndCompress(this object obj) + { + var ser = new SharpSerializer(new SharpSerializerBinarySettings() + { + IncludeAssemblyVersionInTypeName = false, + IncludePublicKeyTokenInTypeName = false, + Mode = BinarySerializationMode.SizeOptimized + }); + + using (MemoryStream ms = new MemoryStream()) + { + ser.Serialize(obj, ms); + return ms.ToArray(); + } + } + + + /// + /// zipLevel low:0 - high:9 ! + /// + /// + /// + /// + /// + public static MemoryStream ZipMemoryStream(this FileStream memStreamIn, string zipEntryName, int zipLevel = 3) + { + + MemoryStream outputMemStream = new MemoryStream(); + ZipOutputStream zipStream = new ZipOutputStream(outputMemStream); + + zipStream.SetLevel(zipLevel); //0-9, 9 being the highest level of compression + + ZipEntry newEntry = new ZipEntry(zipEntryName); + newEntry.DateTime = DateTime.Now; + + zipStream.PutNextEntry(newEntry); + + StreamUtils.Copy(memStreamIn, zipStream, new byte[4096]); + zipStream.CloseEntry(); + + zipStream.IsStreamOwner = false; // False stops the Close also Closing the underlying stream. + zipStream.Close(); // Must finish the ZipOutputStream before using outputMemStream. + + outputMemStream.Position = 0; + return outputMemStream; + + // Alternative outputs: + // ToArray is the cleaner and easiest to use correctly with the penalty of duplicating allocated memory. + //byte[] byteArrayOut = outputMemStream.ToArray(); + //return byteArrayOut; + //// GetBuffer returns a raw buffer raw and so you need to account for the true length yourself. + //byte[] byteArrayOut = outputMemStream.GetBuffer(); + //long len = outputMemStream.Length; + } + public static MemoryStream ZipMemoryStream(this List files, int zipLevel = 3) + { + + MemoryStream outputMemStream = new MemoryStream(); + ZipOutputStream zipStream = new ZipOutputStream(outputMemStream); + + zipStream.SetLevel(zipLevel); //0-9, 9 being the highest level of compression + + foreach (var fileInfo in files) + { + ZipEntry newEntry = new ZipEntry(fileInfo.Name); + newEntry.DateTime = fileInfo.LastWriteTime.ToUniversalTime(); + + zipStream.PutNextEntry(newEntry); + + StreamUtils.Copy(fileInfo.OpenRead(), zipStream, new byte[4096]); + zipStream.CloseEntry(); + + } + + zipStream.IsStreamOwner = false; // False stops the Close also Closing the underlying stream. + zipStream.Close(); // Must finish the ZipOutputStream before using outputMemStream. + + outputMemStream.Position = 0; + return outputMemStream; + + // Alternative outputs: + // ToArray is the cleaner and easiest to use correctly with the penalty of duplicating allocated memory. + //byte[] byteArrayOut = outputMemStream.ToArray(); + //return byteArrayOut; + //// GetBuffer returns a raw buffer raw and so you need to account for the true length yourself. + //byte[] byteArrayOut = outputMemStream.GetBuffer(); + //long len = outputMemStream.Length; + } + /// + /// zipLevel low:0 - high:9 ! + /// + /// + /// + /// + /// + public static byte[] ZipMemoryStream(this MemoryStream memStreamIn, string zipEntryName, int zipLevel) + { + + MemoryStream outputMemStream = new MemoryStream(); + ZipOutputStream zipStream = new ZipOutputStream(outputMemStream); + + zipStream.SetLevel(zipLevel); //0-9, 9 being the highest level of compression + + ZipEntry newEntry = new ZipEntry(zipEntryName); + newEntry.DateTime = DateTime.Now; + + zipStream.PutNextEntry(newEntry); + + StreamUtils.Copy(memStreamIn, zipStream, new byte[4096]); + zipStream.CloseEntry(); + + zipStream.IsStreamOwner = false; // False stops the Close also Closing the underlying stream. + zipStream.Close(); // Must finish the ZipOutputStream before using outputMemStream. + + outputMemStream.Position = 0; + //return outputMemStream; + + // Alternative outputs: + // ToArray is the cleaner and easiest to use correctly with the penalty of duplicating allocated memory. + byte[] byteArrayOut = outputMemStream.ToArray(); + return byteArrayOut; + //// GetBuffer returns a raw buffer raw and so you need to account for the true length yourself. + //byte[] byteArrayOut = outputMemStream.GetBuffer(); + //long len = outputMemStream.Length; + } + public static List UnzipFromStream(this Stream zipStream, string outFolder, IProgressBarControl progress = null) + { + ZipInputStream zipInputStream = new ZipInputStream(zipStream); + ZipEntry zipEntry = zipInputStream.GetNextEntry(); + + var lstFiles = new List(); + + while (zipEntry != null) + { + progress?.Increase(1); + progress?.SetOperationName($"Extracting file: {zipEntry.Name}"); + String entryFileName = zipEntry.Name; + // to remove the folder from the entry:- entryFileName = Path.GetFileName(entryFileName); + // Optionally match entrynames against a selection list here to skip as desired. + // The unpacked length is available in the zipEntry.Size property. + + byte[] buffer = new byte[4096]; // 4K is optimum + + // Manipulate the output filename here as desired. + String fullZipToPath = Path.Combine(outFolder, entryFileName); + string directoryName = Path.GetDirectoryName(fullZipToPath); + if (directoryName.Length > 0) + Directory.CreateDirectory(directoryName); + + // Skip directory entry + string fileName = Path.GetFileName(fullZipToPath); + if (fileName.Length == 0) + { + zipEntry = zipInputStream.GetNextEntry(); + continue; + } + + // Unzip file in buffered chunks. This is just as fast as unpacking to a buffer the full size + // of the file, but does not waste memory. + // The "using" will close the stream even if an exception occurs. + using (FileStream streamWriter = File.Create(fullZipToPath)) + { + StreamUtils.Copy(zipInputStream, streamWriter, buffer); + } + + var fi = new FileInfo(fullZipToPath); + if (fi.Exists) + { + File.SetLastWriteTimeUtc(fullZipToPath, zipEntry.DateTime); + lstFiles.Add(fi); + } + + zipEntry = zipInputStream.GetNextEntry(); + } + return lstFiles; + } + public static T DecompressAndDeserialize(this byte[] data) + { + var ser = new SharpSerializer(new SharpSerializerBinarySettings() + { + IncludeAssemblyVersionInTypeName = false, + IncludePublicKeyTokenInTypeName = false, + Mode = BinarySerializationMode.SizeOptimized + }); + + using (MemoryStream ms = new MemoryStream(data)) + { + return (T)ser.Deserialize(ms); + + } + + } + + + /// + /// Determines whether the specified value contains all. + /// + /// The value. + /// The LST values. + public static Boolean ContainsAll(this string value, List lstValues) + { + foreach (var lstValue in lstValues) + { + + if (value.Contains(lstValue) == false) + { + return false; + } + + } + + return true; + + } + + public static SortableBindingList ToSortableBindingList(this IEnumerable values) + { + + var newList = new SortableBindingList(); + newList.AddRange(values); + + return newList; + + } + + public static Boolean ContainsAny(this string value, List lstValues) + { + foreach (var lstValue in lstValues) + { + if (value.Contains(lstValue) == true) + { + return true; + } + } + return false; + } + + + public static void ShowInNewWindow(this Control control, bool isModal, Control parent, string title) + { + System.Windows.Window parentWindow = null; + if (parent != null) + { + parentWindow = System.Windows.Window.GetWindow(parent); + } + + control.ShowInNewWindow(isModal, parentWindow, title); + } + public static void ShowInNewWindow(this Control control, bool isModal, Window parent, string title) + { + var win = new Window(); + win.Title = title; + if (parent != null) + { + + win.Owner = parent; + } + + win.Content = control; + + if (isModal) + { + win.ShowDialog(); + } + else + { + win.Show(); + } + + + } + + } +} diff --git a/tabler.wpf/Helper/IProgressBarControl.cs b/tabler.wpf/Helper/IProgressBarControl.cs new file mode 100644 index 0000000..7f7ea99 --- /dev/null +++ b/tabler.wpf/Helper/IProgressBarControl.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace tabler.wpf.Helper +{ + public interface IProgressBarControl : IProgress + { + void Reset(); + void Increase(int value); + void Set(int value); + void Decrease(int value); + void SetMax(int max, bool doReset); + void SetOperationName(string name); + } +} diff --git a/tabler.wpf/Helper/ProgressLogger.cs b/tabler.wpf/Helper/ProgressLogger.cs new file mode 100644 index 0000000..3b85517 --- /dev/null +++ b/tabler.wpf/Helper/ProgressLogger.cs @@ -0,0 +1,86 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using tabler.Logic.Helper; + +namespace tabler.wpf.Helper +{ + public class ProgressLogger + { + + public ProgressLogger(string name, int maxCount, DateTime? startDate = null, bool? logEstimatedTime = null) + { + if (maxCount > 0) + { + MaxItems = maxCount; + } + + Name = name; + + CurrentIndex = 0; + + if (startDate.GetValueOrDefault() != DateTime.MinValue) + { + StartDate = startDate.GetValueOrDefault(); + } + + if (logEstimatedTime.HasValue) + { + LogEstimatedTime = logEstimatedTime.Value; + } + } + + public ProgressLogger(string name, IList listItems, DateTime? startDate = null, bool? logEstimatedTime = null) : this(name, 0, startDate, logEstimatedTime) + { + + + if (listItems == null) return; + + MaxItems = listItems.Count; + + } + + public string Name { get; set; } + public int MaxItems { get; set; } + public int CurrentIndex { get; set; } + public double PercentageStartLogEstimatedTime { get; set; } = 1; + public DateTime StartDate { get; set; } = DateTime.UtcNow; + public bool LogEstimatedTime { get; set; } = true; + + public void IncAndLog(int? value = null) + { + IncIndex(value); + Log(); + } + + public void IncIndex(int? value = null) + { + CurrentIndex += value ?? 1; + } + + public void Log() + { + if (MaxItems <= 0 || CurrentIndex > MaxItems) + { + Logger.LogGeneral(Name + ": done"); + return; + } + + var percent = CurrentIndex / (double)MaxItems * 100; + + var message = $"{Name}: {CurrentIndex}/{MaxItems} ({percent.SafeRound(2)}%) "; + + if (LogEstimatedTime && percent > PercentageStartLogEstimatedTime) + { + var timeGoneSeconds = DateTime.UtcNow.Subtract(StartDate).TotalSeconds; + var secondsToGo = timeGoneSeconds * 100 / percent; + var timeUntil = StartDate.AddSeconds(secondsToGo); + var timeSpan = timeUntil.Subtract(DateTime.UtcNow); + + message += $" est.Time: {timeSpan.Days}d {timeSpan.Hours}h {timeSpan.Minutes}m {timeSpan.Seconds}s"; + } + Logger.LogGeneral(message); + } + + } +} diff --git a/tabler.wpf/Helper/ProgressLoggerControl.cs b/tabler.wpf/Helper/ProgressLoggerControl.cs new file mode 100644 index 0000000..644afc6 --- /dev/null +++ b/tabler.wpf/Helper/ProgressLoggerControl.cs @@ -0,0 +1,72 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using tabler.wpf.Helper; + +namespace tabler.wpf.Helper +{ + + public class ProgressLoggerIProgressBarControl : ProgressLogger, IProgressBarControl + { + public ProgressLoggerIProgressBarControl(string name, int maxCount, DateTime? startDate = null, bool? logEstimatedTime = null) : base(name, maxCount, startDate, logEstimatedTime) + { + } + + public ProgressLoggerIProgressBarControl(string name, IList listItems, DateTime? startDate = null, bool? logEstimatedTime = null) : base(name, (IList)listItems, startDate, logEstimatedTime) + { + } + + #region Implementation of IProgress + + public void Report(double value) + { + Log(); + } + + #endregion + + #region Implementation of IProgressBarControl + + public void Reset() + { + CurrentIndex = 0; + } + + public void Increase(int value) + { + Increase(value); + Log(); + } + + public void Set(int value) + { + CurrentIndex = value; + Log(); + } + + public void Decrease(int value) + { + CurrentIndex -= value; + Log(); + } + + public void SetMax(int max, bool doReset) + { + MaxItems = max; + if (doReset) + { + Reset(); + } + } + + public void SetOperationName(string name) + { + if (string.IsNullOrEmpty(name)) + { + Name = name; + } + } + + #endregion + } +} diff --git a/tabler.wpf/Helper/ProgressLoggerForEach.cs b/tabler.wpf/Helper/ProgressLoggerForEach.cs new file mode 100644 index 0000000..aaa3c08 --- /dev/null +++ b/tabler.wpf/Helper/ProgressLoggerForEach.cs @@ -0,0 +1,160 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using tabler.Logic.Helper; + +namespace tabler.wpf.Helper +{ + public class ProgressLoggerForEach : ProgressLogger, IEnumerable, IEnumerator + { + public IList List { get; set; } + private IEnumerator _iEnumerator; + private Func _propertySelector; + + + public ProgressLoggerForEach(string name, IList listItems, DateTime? startDate = null, bool? logEstimatedTime = null, Func propertySelector = null) : base(name, (IList)listItems, startDate, logEstimatedTime) + { + + _propertySelector = propertySelector; + + if (listItems == null) return; + + + + MaxItems = listItems.Count; + List = listItems; + + _iEnumerator = listItems.GetEnumerator(); + + Name = name; + + CurrentIndex = 0; + + if (startDate.GetValueOrDefault() != DateTime.MinValue) + { + StartDate = startDate.GetValueOrDefault(); + } + + if (logEstimatedTime.HasValue) + { + LogEstimatedTime = logEstimatedTime.Value; + } + } + + public string Name { get; set; } + public int MaxItems { get; set; } + public int CurrentIndex { get; set; } + public double PercentageStartLogEstimatedTime { get; set; } = 1; + public DateTime StartDate { get; set; } = DateTime.UtcNow; + public bool LogEstimatedTime { get; set; } = true; + + public void IncAndLog(int? value = null) + { + IncIndex(value); + Log(); + } + + public void IncIndex(int? value = null) + { + CurrentIndex += value ?? 1; + } + + public void Log() + { + if (MaxItems <= 0 || CurrentIndex > MaxItems) + { + Logger.LogGeneral(Name + ": done"); + return; + } + + var percent = (((double)CurrentIndex / (double)MaxItems) * (double)100); + + var message = $"{Name}{GetCurrentObjectsName()}: {CurrentIndex}/{MaxItems} ({percent.SafeRound(2)}%) "; + + if (LogEstimatedTime && percent > PercentageStartLogEstimatedTime) + { + var timeGoneSeconds = DateTime.UtcNow.Subtract(StartDate).TotalSeconds; + var secondsToGo = (timeGoneSeconds * 100) / percent; + var timeUntil = StartDate.AddSeconds(secondsToGo); + var timeSpan = timeUntil.Subtract(DateTime.UtcNow); + + message += $" est.Time: {timeSpan.Days}d {timeSpan.Hours}h {timeSpan.Minutes}m {timeSpan.Seconds}s"; + } + Logger.LogGeneral(message); + } + + private string GetCurrentObjectsName() + { + if (_propertySelector == null || _iEnumerator.Current == null) + { + return null; + } + var ss = "." + new List { _iEnumerator.Current }.Select(_propertySelector).First(); + return ss; + } + + #region Implementation of IEnumerable + + IEnumerator IEnumerable.GetEnumerator() + { + return this; + } + + IEnumerator IEnumerable.GetEnumerator() + { + return this; + } + + #endregion + + #region Implementation of IDisposable + + public void Dispose() + { + _iEnumerator?.Dispose(); + _iEnumerator = null; + } + + #endregion + + #region Implementation of IEnumerator + + public bool MoveNext() + { + IncAndLog(); + + if (_iEnumerator != null) + { + return _iEnumerator.MoveNext(); + } + return false; + + } + + public void Reset() + { + _iEnumerator?.Reset(); + } + + object IEnumerator.Current + { + get { return Current; } + } + + public T Current + { + get + { + if (_iEnumerator == null) + { + return default(T); + } + return _iEnumerator.Current; + + } + } + + #endregion + } +} diff --git a/tabler.wpf/Helper/PropertyComparer.cs b/tabler.wpf/Helper/PropertyComparer.cs new file mode 100644 index 0000000..1a9450f --- /dev/null +++ b/tabler.wpf/Helper/PropertyComparer.cs @@ -0,0 +1,49 @@ + +using System; +using System.Collections; +using System.Collections.Generic; +using System.ComponentModel; +using System.Reflection; + +namespace tabler.wpf.Helper +{ + public class PropertyComparer : IComparer + { + private readonly IComparer comparer; + private PropertyDescriptor propertyDescriptor; + private int reverse; + + public PropertyComparer(PropertyDescriptor property, ListSortDirection direction) + { + this.propertyDescriptor = property; + Type comparerForPropertyType = typeof(Comparer<>).MakeGenericType(property.PropertyType); + this.comparer = (IComparer)comparerForPropertyType.InvokeMember("Default", BindingFlags.Static | BindingFlags.GetProperty | BindingFlags.Public, null, null, null); + this.SetListSortDirection(direction); + } + + #region IComparer Members + + public int Compare(T x, T y) + { + return this.reverse * this.comparer.Compare(this.propertyDescriptor.GetValue(x), this.propertyDescriptor.GetValue(y)); + } + + #endregion + + private void SetPropertyDescriptor(PropertyDescriptor descriptor) + { + this.propertyDescriptor = descriptor; + } + + private void SetListSortDirection(ListSortDirection direction) + { + this.reverse = direction == ListSortDirection.Ascending ? 1 : -1; + } + + public void SetPropertyAndDirection(PropertyDescriptor descriptor, ListSortDirection direction) + { + this.SetPropertyDescriptor(descriptor); + this.SetListSortDirection(direction); + } + } +} diff --git a/tabler.wpf/Helper/SearchLogFilesHelper.cs b/tabler.wpf/Helper/SearchLogFilesHelper.cs new file mode 100644 index 0000000..6fb380c --- /dev/null +++ b/tabler.wpf/Helper/SearchLogFilesHelper.cs @@ -0,0 +1,87 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.ServiceModel; +using ayondo.Base.ExtensionMethods; +using AyondoWinFormHelper.BusinessLogic; +using AyondoWinFormHelper.Enums; +using AyondoWinFormHelper.LogFileApi; +using AyondoWinFormHelper.Wcf; + +namespace AyondoWinFormHelper.Helper +{ + public static class SearchLogFilesHelper + { + //private const string ServerUrlAdd = ".rz.ayondo.com"; + + public static List GetMessagesFromServiceWithRetries(string serverDns, LogFileType logFileType, DateTime from, DateTime to, List messagesToSearch, List messagesToIgnore) + { + if (messagesToSearch == null || messagesToSearch.Any() == false) + { + return new List() { new RowContainer() { Date = DateTime.MinValue, Value = "connection error", FileName = "error.xml", ValueUpperCase = "CONNECTION ERROR" } }; + + } + var include = messagesToSearch != null ? string.Join(",", messagesToSearch) : ""; + var exclude = messagesToIgnore != null ? string.Join(",", messagesToIgnore) : ""; + + var bRetry = true; + int tries = 1; + while (bRetry) + { + try + { + + OperationManager.LogGeneral($"Calling logs try:{tries} {serverDns} {logFileType} " + + $"{from.GetDateTimeString_yyyyMMddhhmmss()} - {to.GetDateTimeString_yyyyMMddhhmmss()} " + + $"params to include:{include} " + + $"params exclude: {exclude } "); + + if (AyondoServiceClients.WcfServiceAst(serverDns).LogfileAndSearch != null) + { + var result = AyondoServiceClients.WcfServiceAst(serverDns) + .LogfileAndSearch.Interface.Search(logFileType, + from, + to, + messagesToSearch, + messagesToIgnore, true, true, false, 1000, false); + + OperationManager.LogGeneral($"Results: {result.Count}"); + + + return result; + } + else + { + OperationManager.LogError($"{nameof(SearchLogFilesHelper)}.{nameof(GetMessagesFromServiceWithRetries)} LogfileAndSearch is null"); + } + } + catch (TimeoutException tex) + { + tries++; + if (tries > 6) + { + bRetry = false; + OperationManager.LogError($"{nameof(SearchLogFilesHelper)}.{nameof(GetMessagesFromServiceWithRetries)} Exception: {tex}"); + } + } + catch (CommunicationException cex) + { + tries++; + if (tries > 6) + { + bRetry = false; + OperationManager.LogError($"{nameof(SearchLogFilesHelper)}.{nameof(GetMessagesFromServiceWithRetries)} Exception: {cex}"); + } + } + catch (Exception ex) + { + bRetry = false; + OperationManager.LogError($"{nameof(SearchLogFilesHelper)}.{nameof(GetMessagesFromServiceWithRetries)} {serverDns} - {logFileType} - {from.GetDateTimeString_yyyyMMddhhmmss()} - {to.GetDateTimeString_yyyyMMddhhmmss()} Exception: {ex}"); + } + } + + return new List() { new RowContainer() { Date = DateTime.MinValue, Value = "connection error", FileName = "error.xml", ValueUpperCase = "CONNECTION ERROR" } }; + + } + } +} diff --git a/tabler.wpf/Helper/SortableBindingList.cs b/tabler.wpf/Helper/SortableBindingList.cs new file mode 100644 index 0000000..78f5c3f --- /dev/null +++ b/tabler.wpf/Helper/SortableBindingList.cs @@ -0,0 +1,110 @@ + +using System; +using System.Collections.Generic; +using System.ComponentModel; + +namespace tabler.wpf.Helper +{ + public class SortableBindingList : BindingList + { + private readonly Dictionary> comparers; + private bool isSorted; + private ListSortDirection listSortDirection; + private PropertyDescriptor propertyDescriptor; + + + public void AddRange(IEnumerable lst) + { + + foreach (var currentItem in lst) + { + this.Items.Add(currentItem); + } + + } + + + public SortableBindingList() + : base(new List()) + { + this.comparers = new Dictionary>(); + } + + public SortableBindingList(IEnumerable enumeration) + : base(new List(enumeration)) + { + this.comparers = new Dictionary>(); + } + + protected override bool SupportsSortingCore + { + get { return true; } + } + + protected override bool IsSortedCore + { + get { return this.isSorted; } + } + + protected override PropertyDescriptor SortPropertyCore + { + get { return this.propertyDescriptor; } + } + + protected override ListSortDirection SortDirectionCore + { + get { return this.listSortDirection; } + } + + protected override bool SupportsSearchingCore + { + get { return true; } + } + + protected override void ApplySortCore(PropertyDescriptor property, ListSortDirection direction) + { + List itemsList = (List)this.Items; + + Type propertyType = property.PropertyType; + PropertyComparer comparer; + if (!this.comparers.TryGetValue(propertyType, out comparer)) + { + comparer = new PropertyComparer(property, direction); + this.comparers.Add(propertyType, comparer); + } + + comparer.SetPropertyAndDirection(property, direction); + itemsList.Sort(comparer); + + this.propertyDescriptor = property; + this.listSortDirection = direction; + this.isSorted = true; + + this.OnListChanged(new ListChangedEventArgs(ListChangedType.Reset, -1)); + } + + protected override void RemoveSortCore() + { + this.isSorted = false; + this.propertyDescriptor = base.SortPropertyCore; + this.listSortDirection = base.SortDirectionCore; + + this.OnListChanged(new ListChangedEventArgs(ListChangedType.Reset, -1)); + } + + protected override int FindCore(PropertyDescriptor property, object key) + { + int count = this.Count; + for (int i = 0; i < count; ++i) + { + T element = this[i]; + if (property.GetValue(element).Equals(key)) + { + return i; + } + } + + return -1; + } + } +} diff --git a/tabler.wpf/Helper/StopWatch.cs b/tabler.wpf/Helper/StopWatch.cs new file mode 100644 index 0000000..0452d30 --- /dev/null +++ b/tabler.wpf/Helper/StopWatch.cs @@ -0,0 +1,100 @@ + +using System; +using tabler.Logic.Enums; +using tabler.Logic.Helper; + +namespace tabler.wpf.Helper +{ + /// + /// Class StopWatch. + /// + public class StopWatch + { + private DateTime _start; + //private string OperationName = "undefined"; + private LogTypeEnum _logType = LogTypeEnum.General; + private string _operationName = "undefined"; + + public string OperationName + { + get { return _operationName; } + set + { + _operationName = value; + + } + } + + /// + /// Initializes a new instance of the class. + /// + /// Description of the operation. + public StopWatch(string operationName) + { + OperationName = operationName; + Start(); + } + + public bool LogStart { get; set; } + public StopWatch(string operationName, bool logStart) : this(operationName) + { + LogStart = logStart; + } + + /// + /// Starts this instance. + /// + public void Start() + { + _start = DateTime.Now; + if (LogStart) + { + Logger.LogInternal($"Started operation: {OperationName}"); + _lastExecutionTimeInSeconds = null; + } + } + + private double? _lastExecutionTimeInSeconds ; + public double LastExecutionTimeInSeconds + { + get + { + if (_lastExecutionTimeInSeconds.HasValue) + { + return _lastExecutionTimeInSeconds.Value; + } + + return DateTime.Now.Subtract(_start).TotalSeconds; + + } + } + + /// + /// Stops this instance. + /// + public void StopAndLog() + { + StopAndLog(null); + } + public void StopAndLog(bool resetTimer) + { + StopAndLog(null,resetTimer); + } + public void StopAndLog(string name,bool resetTimer = true) + { + var tolog = OperationName; + if (!string.IsNullOrEmpty(name)) + { + tolog = name; + } + _lastExecutionTimeInSeconds = LastExecutionTimeInSeconds; + + Logger.Log($"Finished operation: {tolog} in seconds: {LastExecutionTimeInSeconds}", _logType); + if (resetTimer) + { + _start = DateTime.Now; + } + + } + } +} diff --git a/tabler.wpf/Helper/TranslationHelper.cs b/tabler.wpf/Helper/TranslationHelper.cs new file mode 100644 index 0000000..b73ce6f --- /dev/null +++ b/tabler.wpf/Helper/TranslationHelper.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Threading; + +namespace tabler.wpf.Helper +{ + public static class TranslationHelperRessources + { + + public static string GetString(string key, CultureInfo info ) + { + var profs = Properties.Resources.ResourceManager.GetString("HelloWorld", info); + return profs; + } + public static string GetString(string key) + { + var profs = Properties.Resources.ResourceManager.GetString("HelloWorld", System.Threading.Thread.CurrentThread.CurrentCulture); + return profs; + } + + } +} diff --git a/tabler.wpf/Images/Icon-16.png b/tabler.wpf/Images/Icon-16.png new file mode 100644 index 0000000000000000000000000000000000000000..f2b1fe857e383e6fb080c9dbe567ac4b6bf58728 GIT binary patch literal 1205 zcmbVMO>7%Q6yE&cq>+oHdt9RlGaP z?xc3C9Fm}-&{TyJ^uQsf9FRcJLl1>25tK?5;=%zT4j@srDiRVu%>@C1*(44eq9U=< z?)-h<``&x=-o9R*Ja@eBbRWlY$BPqMg^jWB?TxVS(4)U}HVo4I44oo1+R%N>sTMIX zC_4Hau3+6-dgU%23z!VsG&UQ2WPakdb zz_v2{bgBePUJlRO6D=Q4wI-`(Yr&K){_OK$tf?>q4yHP2I(0Wtni+o2uEOTww#b7$ z2wlkV`%cZ2${GWuuTXX}eyC!by+D!L=n|&-- z$@y5P#IF)kZ&yHho=_6Z6A$F3QUU_gwri0_5MIxIv>Nv9i`Xjo!~uKxRqP}55&W;X z_qo>p$(hKU5yRs6SFyCWSOtdD!_sGq!{)&*>lmN4#!71^&)VvKQB$kUZ;a^dt+zXR zVowZtCxxdV2EA&EcT`2sv!n8)QhxFRcCRFG#a;7SWh4`ywg zm9toF7Optg%9RxsmvL5B_~ewQLTEw2*;&?FT`Lp^PYZLpLLq;d#nRi`o7bD4=L@(j z*3!~a3um*~Y`KskH@LwYviIeBgVQMz5l=NAbOhY~klW{F5wE?&7Y;4V$-#o8kI=3j zzf_Pnm`B=}=kWDd`s{v-HIK7Mm?7f=ph;O(fVYQyfp(wIQ%+mn(&Y>Jf?Ym8Th&&W zXJuEoy-r_maDgQ{xm>=CiLbVY_;R36K`s!-W^K0?me~r+3X11*wla=WAfYLva5VXx z?#>MwIP$qNn^lQJkun+w^rzDvvJVK0GOd7Tfdz@IAUf$$q*oMtU!CD}NPXcC2Rx+9 zoem4{;d^**Ck?cE8`_cG$7YE$h8bp(Fib&n&RWNr$@DQXx|1 zRg5G>$Fh?YRaWKm_yW*Fe0lx?ixybXWpZ>wRaHyC*Xj1~<-yjvO17boVeRFrGW zvntUj(rMyp=lep9_6>X>DE1s3C8Yl{ySR^rzn*2=eV4{QSb4RzBzp2OPX| z%ur02N3J(1YpK15FK<^?QwGbm)Xk1{*2qr4(b*}3dfe)EP^h|j%Id^YWylyE1VdAk zHoJ&&r>DoFC9i^^n)M*c1ktEsG%;roJHsOOMa_B`ISCn$awYL09&PIe$Q%pMcKoL_+y*mi9eM1zZpcrf8k5)sGk{B`AVL*DY z%lAo(ly#oPx-{-UycX&(P|$d81kB|Ez8UKj5yw}=cY z0)AILRyoW)R$OK+5;d=Qk9o@ve2i7ad(0U-`w+D|TC4euNX6=5?y-_GtF%IjkFlW` zV>R&}`<;!k+F|ao(lV#}H7Sk|637FViW zy5IRcMptR-b+Wi)5Vfw>-bkTP*aU|CXN$A}9i#UEL5KdM(QENS^eGT0mp*MYV&de| zAc{UHPA+}gXvD4q7RCbOP@9xF>!Kf5JevpCzn2LG-Bf9 z(jbaHC{8YY+GxbY$)!OQeNdcS`n1uAiIYo%DEgo{x%6qH5fdku22u1uadPR?Mk6Lp zE)AmSgW}}Ur;SEToLm}2(FeuJrB54;m^isKh@uaQlS`jA8ZmKlX%Iyp6epKHZ8T!y z7-ph>4R+gDCo-U!Pp5@|7;U7w&QCg$rBAjW1>7 z5||6%8*hZ6x5uRU18#4qIUMqbLjX*~Bvqb38}AMGh++JN>m#c0x4|3Y#W)Nj4APUd zP5w$x2V8rCm`4)4ZSFoyUg-`Y9MjVB_yFGS&|b5$9YC0z)b9{XV7MK=J(U`KzAM%Q5p$;7Z>7msXY?2G4!c570~* zb)}=*)!ebp0p$zV?+BD37w@z>S=Q+bcP#ep!WxoKUBDXytMtUCs|+~Xmw7|A(_1~* z6Vj*B<7BnqtwB$Sz+3t}i(94Ssq1+MTu}gbwZN@5v@e(zS4&XrGz?>6_$3|M$ahjS zQN^~ybv0VWwmCc$-V$&uUPX(=-ZOnh!lRga_%$#_@t5@MED|?@rpE6@CkTC>L0}2+ z-A7VRke;UytY4C6Gx>%u1L2g}^hTppu?rX@NxPS%s%I>noe<-J?<4{-2#{+oy-b4G z2(s1iEv6|XkX#u;aDEHV4C7~*h~~%iAx3LPMGhp6&;n62KuOZN1S5H(wWZ^QBM_6p zK&g^|b;tG~W2O-dDFh;nCgWm227dzOi!j982!BF6K6=9*9Hu1S@<7n*@p)bFOjw=w z+B?KSVFvL~$-~_`ydp&k04q8}d_VzX+WZbBmed}%w;3*+a)&kusj$aWd+dE`DE1Fi z>G3uRsgg;1@)2r8Zi%gPD#k_C+1wcbInx&6{pv9*G!sdRE#U)rW0O!)HUQI{yw?Xc zmBGf9n3kYx#Tz+rke369eiB0N9)93OU?!a+Qk-F^3|##&U~J?3`q)x?eSz)@w2j@pafe?E$!wtP$>7S?*~h(h8br?y?7)d`KF?goGao zkdjO-{KfJE881=%kR9yec~X0i+sg~{iC6}~IE7$D4x?jiB8H4V!xxT;*iumJr*znZ zykbH#GnEX_c$qL0Vm3l30BK-c!X;x~XHea*t&Wft;z)TYaRpM43@DkE&y^uxkMNB3 zU|L;WVmv-41>u4#J}9)tpeiSk#6hCb@Rv*;8mbkzlU)H{*slU5`N)kr!nBcI(}vjT z6*+(-!yXR#>Ub}X9Nq~41}_y75~tF{2*H?!9v2Hg!`*%p+z6)7D4;|fTr5fSjAs<{H)ex+2Z)y~0(G(G^N^I`(1vXZA+%B)s_>r{n^&%MRk?iC< z?O`&jo7eM!kVf+5B3PX~t;0ob{!$P(lj5(elOiAsv()EBTAM>YKMcO|9YKFnTP-Sm4BSP=;-zF16ZwW&=IfW~T=PP1eGAJf;sz4Tboc|H zIvH9ZalRAo_=E5!2zz=%euQJKvpc#mOy-d608|jd;}Pzn;e$yU8eWWHXO9>7+lY1c zJA0fMegwjQTpvchH#I`|)b(z@7s4+>c!nq319C!$_YQ#y%y(3RB0eA6*18fkq7@p0IX5#(MsHm2r9tXGboqT|Yd)V0Jz-4Z)3%c9ubmKh8y1l9^ z{S+AXGn)bf1}R@dAZy#tO!kp^%&2Fw8PjJ^F$q~|jA_l45Mz+~tIanX zAq?^4TlHl;2Of<T=6>cO<}v0; z=2_+?<_%^Svzz&Z*~5Iz`~W(0vLVBeWtd=?YM5!5Z?G9k4CRIzL!+V9u*z_h!Da9o z!iHlFCmYT*oNu_yaE;+6!(R>e7#=b_VR+8)n&BP8M~43zzBihT>Bem1WaBKO#aLpj zFfK8+8`m0L#-oiJjhl>T8!s_#HU7!C-T094N#je#UB*w0drgcf%{10D&6H~@F;$tG zO{-0vrhw@WrZY^NOtu0gZUiu zHuJsaXUx0JKcr@+&Q4vJ+Mc>D^~BUmQg2OtH1*BYFVoV}a?(oE4oh>Vosf1(+F#QC zk@im7cj=?k=cQMruSpN5pPha~`i}J1(!b2e$e5L}IAe82DC6vmn=&5Gcst|U5m_Vh zMl_6YjyQhAmJ!=WJU`;|k>-&zM^=nHV&uk=n@8R;@|lsJjxvv$HL7ZqebgUDZ5egX zs8>eq&CJTQW;SQ`WS*6IbLJD7AC68QJ!^E$Xy@onqpuzP@aXrlOj*;jsk3wcTIR}V#36E z6Azo%JMqeik52sbpzMPVImmI)83)~d(Cd?oljcooopj8kYbQN5Y47AIlj|n?Cto`G z;mMy)89Qb1lyy@sobtewkEUi#EuZS1dg0Uur+&)2^BJ z^t2yxX6G!+IVtD1oVTW@PA{3>IsL-vJE!lNF?B}MjALiqGUN4`=9wikyJlWI^YNMA z%$hxG#jMk2-8JjO+2dz7%-%Trmf3I4$(XZf&e3zW&UtZe(%h1{-E*&)`|Ld9yux{1 z^R~=;X1;NL(R}y(E9O6UaN@zG2YV0Rdhjc`>A4lT>vM0(eJ5{hUSr-#d3WV~Zkb_O zZ8^{KxaDWAkn?ccxHqh$t%q7qvfgX`uWg>qVcTMRF+U@}HvjniyYs&&m|wsbTv_mH zVOC*N;c10C3x6sqE(#RgTJ%xzjN+q;FE4(jB)g=g zi?3h&LB-sPbrpZA_`H&<3{>7(`At<>)p1ojs!i2()n`;cT{F67SU(lEKf(Qs44oMq~p!uzq*)2!6+;>>gVJ(MkIqdybYwNMCkGEyD9ocqs+t=-t z?dP<=v24z=@UorDM=oEp{HEpKtf*db{)$~IEh~>(`Q)mJtK6&ZUY)#p`ReOe?>)Tc z@QV)Ly{2%@scT+dJ9};4+9!^fc!cMOzaKgBNc)j@9F=&~ilc5m>PLICeXD(MM?=Tu z9eW&Aj*A_iI2SuFbbiDy%&e&>g-g{})+A9XG2+T8W2yUKl;`-^q;>#kb& zO?Pwm4c!sX3eRmlDLqH^+~XbX?e;$6o8s&9J?EeAKh?kM=(3|PI(koFN#OdRA-Fbp zcPJZ_si(qo!l#7aSzo?>%ldD7m-pV$m)Ym-duqeH4X1DTU}NpZ>yAk{#&OKfW2YT^ z;<4`>S8?1me=z)^;}1KJpMLzN<9DA>cfyS)rk>b+;=fMfPCEajuTEZZ^1YiTZ#rSq zd#BW$a?7bBP7R#;%4vt3cGVvf{^>2r$Cx$@kkbG_%jeBPq-ZahEp{Eg?ocR|wy+b?7A9Ewcv;tFFKwyZa@*yTEqGq3;Y2Ja2KZfw2rk(-Kd zy6NUgH=lEh@s{u{AN^^~pPv15^`Gy)HTTwQZX0{snSWva68_7_e?982FW z+;QvQX8!H+JG1UQW4mGdhV6Uq>bh&!-K*|??w&*M*?I3F_uhG5-hDURKkfc4e;@Pr za~?>2VABJU2RA;rcZYw+rw_RvdT-~EJKuPC<-;#Na@ZqJKf2`6e>_(E*u#%kJpSN6 z7XIV@C(53<=bt72yz9xLC$~RU_|%>MD*V@-PZvGC{h8ut?tZrP*?XT`@Z1B>FM9r= z7ph-)?8Sx`pL}WQOV7Q$?B!QqS@X)SSDmkZ_?qXnFJ52&`VViM@MhwhXS_A)t<7&w zdVA~t&i&upb`|aV`#aU|JoRqdyKlVbc<+;c2mk%!?oID!yubN_sUO_*q3y%_KdSxc z*^dwZc=sp%Pk#9H)Xy?MyZrMxpa1PYi~sY~o|Suce-Zd1^53(*obcrhUln|{b8pMu zx4-WB`iF1M_;$j#H-1<0-Q(Y{`2K?*dVfs*@sgkB{&erpOMZSc(i4f0wMI7422dHG z`&g(!Gsaus3-yUn!XN0;xcmlvVmxDryc+q8NhcR>A6eA|&!00R$P?o{0TLM^Z!nvf z^punob4t3|oSvDMnwB|cWP19@G2^qc#$;uU&rByD;fFp%e;YE=(lSP5j2bawRQ8Aw zBeL;pL^jQmIS>Sq9ZY5lG+>m;ki!@=4W>*(I>SPH9M~j6^(m-*}MFI@7VP4 z3*q;^tet(~wp0Fg(IYSZ`>X5jeDtN=dzW{vKXvo<+aG)R{jZDbR=9dkyZDB?9)IP7 zZ!#I95o()2>Xe+6SV*cc%{n>(YH)N;R-*01^Rlr954AqGCx1rAJAsqVuWB3P2o`)X zGYKn@Jgac$^H7Ov$2n`36@~bBr7GyxV76R^$m>kHiIkbiEMh+Svh2=Fk6U|p`E?h* z`~8)t7o7Xb#m8m55n*~?iZDB#fB555_u01|{N}hLf6S;` zwC&&ThL^jR9e(TMd$$BnaRg7hd*NrVMVQvj$qi3D`SCMPZ@;VU?7Z;5#%A1F{_fYs zuAf@}`r$htJ^XNlDZO?>-zP_uFZ%APZ_bIlM%TvENH?y6Z_=eBnF_|q_?QmZ6karhh$^+k%DEam^P-6$;0I|ASI(E2TL*JH8nBwAdtc&8%C3X0W1UXiR4fR z%kMB8B!$-*<_Kwwkj4sYbOy9-h6xyKB#a~Q+|%4-XA1LfgTH5))E`e^7}$Lme*3-N zp20io%eZ2=W}byR>&Z=4z|vP6@7 zs#5Lhr!Iw)qV@b?VY?HeQBuN*87rP45DA5c&%!=GdBy{3<#T($OOC*?;8c83L@jw; zhPaVmD?uPWv1MtU4QrYT76Wj|2ispx@jNiy>ua)yLOj`&7J&za0(LKKli~K&hH7`H ziw{(ITyU-s>Vh`_5c`6WQDDF>?q!eH$lU`+DALw8k>J;04kot;w!Gn2reT6`#D@(_ zhTZib?3YOg9wg^h%*dql1PfsA7U#TE`WR+@AEhIS6Td*5(-h;AajnH00R#pRuxz%;0UlDj(!S1wd|rcovK0p@{{n>U+^3gY>#&cChTv&(B+o z=@~{cJK&G7-+TfA5$+%-m#(XJ)GwwdTxPf14)AzFpm;5p`$14 zg}rysfUt)unL6wr&jvU4O9K3v@!8?&@Zd9&6`$SSPUv?MPoBHI-PjkHp5hGpJ5|pP z51!{qv_Kret{yC-9{voZjBpUS5kCd+C--Rzz8VQ%r2|l`fZ2m@Rl(C#?3RibzpOc8 z(ZRQqay$D1gdY~C`^L}OR=Rg_;@ezPeehGrg}jHogtilD4CT&J2s2D6!CFdElwwUN zcjD3b%nM11L2##`ol>BELt7UdV60&bi|#N#{^m2|W(k<29|1mZ@whD|&85rdES~qb zq`dR){4ea=DqGLA_cbEz2#2-zg;?Pv%?LZX_({hzkGg={=>)MS2nZDn6A33>OmhH) z5EUXMjB)jWjb8k%@P;bHxC*Z~L}67}wwWC4d7XTpBn?2I)p+6MA^83zd&r5MlXGQi z>VgHSW{VKvc7#&R2mlD|z54mQD%#fs|_qBcoNNWBmv|K`228i=;nhIK&vFwLHe;&IM)F~ zl2;_DF<11tgY4lfyvB;<;17S-3aD4Ef(QiS9|e+@(e{}w(1waYz`lV!95V<7%gr8= zW|%F9LcQIc!h4&w!;Au2#lR&;;C>jQ5 zIziqM#_60!1=$iY{c1SdW%G;VHj+}Hl6V+&IGa~OI?kGxpD*^F+0qEQ10TQ!(nMlU z%Do9pTIYfG$Z4?q#Xo@!%oc2RBX7qM36WA81Q4D}%iU5BFaN-FD&kavJxkE;vIpF1 z_!77h+1DLz4mkOMi~`<96xe`0i)Wg?AVevUQ3ez^5UMuxY)zVtyxquqU7;?4!&w_8 ztfe7%s1J;SIy^jUh2EhGF zWw460Vu{u60GM>*c`q^@ek|=lFj`YeCy@z>X$eYtS==jtX6hiLCYDv>v_G#uq(*=EafyC)1yp!0?(Fz{Ct8p1e*oInd-H(eAA4y~5FlF?#a zYdv;#2h*|$SVcyX7$*#MdsoTbCpOIj#xU5QE8Nad7i%ra|>&rUp$WYWHDtkPYOXpyUCq&<%<0LDCtPWkJ3cI}`?%-9x5A((lsP zgg4~j0Oy@DIfZp3?M$Gg-A^?yvFy(jPm)q-GU?*stnK;@g11h^YD>kH0p=RVFnDL zXo}GfA+H4^1Uw2vnwUVY;PwE%pOfI^1c{gGHaRRn1kU6p^Q0XnrWJu*&0b?Ik8TlDPxV;@$95X3YQ%@Byu>H!liQQ z+z4(Ivt|x+ICD&7cO-$iHo`JDaHAt8nsW)y`$@(z>`V#~)j^?sP~gEBL5Mt9!nFYb zJDHGJ$$kj8FQSPk`fVpoG`J=q2U(hY>)cDg0x*g}&{HM=Vx}KPDPo$Sjq8A2mH?yl zz;7Fz5``FRG|dhGmu(1f{QJLAC$=&rP**4cu9)LfkEE=@HTrm(#by)3n8ElMd+y(A?o zGil{1E0h)q7QGsUW~kSqAj_jxqA*41tV1p8Rj6fOYtR9#K=-}=)LeZ6X0jYr%$pWb z)X0jTMRVP0(O7j_`dM>I6M~sArp%A~#a?oDag`^s5?O;$HI%H!s5T}jUUZQawe-?n zc&P{`t$sv`Nec#x-eSw5z0|__)zOVBDys34V#EcNT#N`25{c^<^#Y5uPqDlr&tg&$ zzpR@pdQ@*=1sYP!vdW^ls3PhKYWT8-Mt3x#7F2XSj$2%4*soYlS)|33(8k!M6i5K& zLQ3di^&(2vlu?gSYRg0o5ml3z<~>S_R`$aW$P zQ1kUrUJ%@zd=M6NAnjJ@;-}&(470#RT!0@I8z~UK+Xc6DaExvRd)-!~cMR}|zPUHG?1eO7DeLAjB!vRz5V9;AL#Pw-e z)rsrV@?MEbJrqxKMC~xHPsbi)s0b!2y5iO-Xl}S}G{^O6>4+k(PxEnoT0Aa_>(jCN zarnUX>GE=7<|CUGCG^^fu}~r!xL}yGWk8D{v|sXggJ`vr z0EZ_|@+@0(r4mc4-?}wd!Lcf9t{o|lojK`PN6F&Rm(BaB@1?V$ZD@5TT63ie)?8@E z&ww>Q+K9~~)?D*sYc4cBGl1_n`OF!Jogt=4uIYg58sJnDsY)rG4H%Narxx82yzs}O zQvrz=s1DX?0rD(Uo%rMY#%<{M%Rbfsp#2zFn1P`YW|EEx_O+A53PurZIryBC z{|8>?zIT>{Qn{flwZEOF;V2Jxu;f@b{2CS|2&+_X31KhrF~p*n_5{CIsUs4A)@{QRxGs^S(-7P1K3~X#0RT zEV`}xU7BJn4L~BOqzYjP6@(yDK?o^T5Yjvqq!3w41u2Sw6eEPnBZcvaGE=`okDP{p zatAz!hmKSr`Xu`a05A0krVtPoEgm2!9;t%$20W?7P=6CpKVnGR7Dl^b)KW#TQUSvi zv{~88W}|fn%c0c@n#_O+44TEH60?{wn&vQI_Ckzh^vq&@;C@7dnusBi7%`&>j$nWT zCO1mj2!=1rwag7@86#W7aHGLS#uQ12q(oS>m5JPsY z{dr<1ptaM?##(KF3N2Y|u#(k-WQYM;rg%8~*&hE#o0;Db6fe9;!A1{$w>Imxkkw^3*F%MW} z`+9{OGVbPpzsv580jnLxilOaQtCsnzeZ5}UTL|j|V7y+n6)ncqF$k{ccC)#7Y-XVe zq{lnx>KI zQe*?U3}ydIGG3Bo*f+dWf`b&G9(8O!_FhyhJ}RTzU~30*ujT_jnRx`E3Oz%5tqMFt zeLbRZ!WlPaV5pNo3#9)8P&TNNptds}7DYkDA;@$Z&aK!um0K&yVuj@}#H(Fd1%PBR z3?zrCh0NwKvnze`zzRUpFo;ls8eqI+MNEtUVL2$ezACJW$+D0}pwx$fBKftF*)iIq z6;Ml7#0rd1EjM})ZseU&g~3D!3s3R>QSx!nhMb-)RjP^L#M5Xv>gYdZ>H`K+rZns|?#uz7x%>5XS=xYxu8{FtWkbU1uextar zPaKR;_A94YtuP(-(oTukg*Y2E2i%~#k-Pb^X;_zLFPv6%wYP%)gziv8WguT5U|PY= zE{yz0m0J+W;U2FNLdLnMugQkSWbuH$jWAH*ate|g`x8r&>LogD=PEW0AQ7#-)FA_+ zlC)pbP0U$&Fl*(()dme_F}##)YT_OCZn$x`kr<+eV52?+TaeVi)((cXL=q_Wsl{qx zW5k0QqG#-*v}JGyiXX}iKv{O!+T`InG!Hb)`dh8O9z)Q7RhB!ge>)N#R=~vKBr`#0P7}cfHD|YJ6)jo261wiR_sl7 zzaLkj^rTB80r5m+VN6OWrMx5xPCtb1(aW5npSftCna%o{xqW43*UZ(=UAV8@jOhR} zbBuoGeN*hu`kCR7O%lzqZf&@dL{~Ry5*9q#Kp~N>@+E716;#?#L0f%{iMA|Kz@pQt zt@K%RhHmQt74xvL5BN<`Wn>6&uXxI!+$?DJ^WJK(9rC~(WRQ=ze@+5QRC(a)j_8QV z5P=z}q9tb-FJ_32m>~7HR3^-cT4f^YL6r%pX@&um38PS>Oy(95MN~VP`yk>#+X>zI ziDLUPVvDm44cyXn5Jksx6DyVU@X79bq)Q z#re^Y&sHYSf^6BWm{7W4sW445@~n~)saZLg${-0 zY15HNgDzB8Jg8xX!|uJl1*D8>8reYj5Mg_gtkQD^yX6z zI4oLi&es+&T)L=|My*LWSkTAd7%F)&82vC`M_vpoZ{gxtOF`5fx>y^`5WRrW9l9DT zn|y6~G5Dc7DDrB{i{Vue^L6CK@RC4{?<v!1BECO@`s-5NRJ6Po zwM)@Tnb@V!7s8Mzl1@|6l*&-6oWz1eHRX$MZU8ml0NhQaH#C3&WbC^c`gb~k_c833 z+X*bjusOdow-c&2NY*yLtk;QX7yg@aIssjJz)mLx(CKlnlV8v4M6~tCU&)k>`WYOs zAA!=uR>D2>UMIq$7AKn+{}S4g81TN`PK4KgsC-X~ZF#l=EADt={u*?E2xYWeVQ_s;^a|BbAoR0ND1EcdRI1 z)gpk%D_#gvMLnp)0;weo6ZBpn?gQexPll=vFpDZ){eoJhq7LAU0J5Btinu1g6TT0x zZ&<1Vv;S|UD*aLgnMA`5T4gV&$s725EexTcA|UWk?6iw4U(5tLt=S8TJE zg3e1B4*ZrXf(~2|#Q+7rEcwBAS&W=SX8k^5`Xkg+9SjV?`_Yt%|RZB14~Sb4%F>Yc+U9+>m4N4OFWR zF+;B3Mv>ZzJv;cK6|^mc{+S>p zw%mfelA=P6_${E5kocxS#0GB}6vSu{yxLXrM_HqyyaKTIE>hK~75sSdRaJw^)Zkr@ zy+}QpsB4s>94ow_uheEOEKn5$Z>$1uY_diTit`K+*0iCLOc58Q)S+8`RUEWA%8yDM zc=Dnh#;gcb+*p9~BXP%q=o+{#i@YSZkzWtTJHTJ)mgeD+li{uaEL^M!%u9N71{ca; zgSV&d`LRa8@ z{FPo30*?o<&c}f^_!U0n(dZ;e0>rPCz*`(7KkxXp67g##;@3)mgpOY;0fG~c1>)CA zh^t2R&cW~<5m<)tS_xEYU=bfa4&O}=!kx~wO~GymrsK`fc+WF@;Erb|B3wRAE{ujJgb)yh;Dg^7Ab%u|WT7CM z8pAXlJd+0sfG`4RCMg%iC4ey>1}Oq5FFtF35F7pz@{n?Ac7lm!LI6pK-=ya9w@?p6 zLDL9@5`+{n2|^^rD`3C}MHcc%(kRnGm}J6gkT8D9MF~~G9|260kvy0V^Y#BBsc1DJ zAwfj55tx7ge<(Wm7O>JNEQ5eBIZZ<&FpNp1dXW&tLokqNIg2ti!9YqPt%XeZAz}QI wiz0|Hio^;&90K8Owfk?K-JG#i1Dnh^YmoD@T! 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 literal 0 HcmV?d00001 diff --git a/tabler.wpf/Images/Icon-32.png b/tabler.wpf/Images/Icon-32.png new file mode 100644 index 0000000000000000000000000000000000000000..5422182d6ba05da0ce8a7a3d927718d526b7d9c8 GIT binary patch literal 1489 zcmbVMZA=?=9KOP~LZJl)$cuqpiV}u!FKwaRjSkvgfyT9iwn7)pwrlTz8?@J54=L3c z*k&w#kQp7!2|7u1Xy!H|F-(V$teGe*%nT>n;)wWV(F$S898-x`py&rO6EC^@zdg_I z<@x>o*I8|@lu9xs002mhRfI(t!SEZiP565K{@;WlgE!cDD_hUEk{k_aDb_)QMi<#Y zTWFGMJNy-03INgdjLpv5O?z-B>w?HI2J*Q)0viBI%X}Wv*+lc8gKl8l8u`NKqjHd; zH1fJ46Jqk{=|-l?&(T)D+2-^&IWbCJwi_(<;er7d&6A+d)$I1-K8<|UE-uW&+prv5 zh44)p`C3qRQ#Gh(IT|d2kU}R?jDp1~2vs4N3M&8=2#Ua{0!Gw@D1sNMaRdd|AGzR- zqv~-BQL*kzSZU;qJnz9_xV5zvYE?ok*8rm!hQWveRwxPuM4`9M&6B=Dw>KwZfuOxk zj`8pe>juLXNeA1)Yve+tYbm%qCewytw|8AAK{D7!dSDbnV3#YL*DBh}Tj+nn*c9!x zwRvdRLVMX3&MDNRJ|{vJw0pFpFi?mF-^(#VQOIV3b+))@H*X{~a^VD`7z#%)g|1l0 znb4w$L4~3^0##yaErzHo6iOYUh}hVSt1Kc=ErJQE6FL+%sB{Xw+Mq`jdZa|DGN9@R z*XZ{0q}xeH{4#>yHEv18Be}Sqqe-6SY%JRx>454+mS??J67? zEn9--nCEG#f@59as=he0iGRfKUwN-_ssE!HECd6Go8w>264??uFg)F8ePOY2d1$wA zV>sbzY$;u;0e~oxkS9EdW3!=jX ziQ=fir{3(6{uwp*efg#AK$?EpCrVE0t`sdk1HKa-yyGi)1)F~Sqx<=M|S#UNMJGc{?&;r!Ob0-tc;^$sk&hAMWpG++ebxnzCjve`H<&UYD&7a`3zJchI5i&&tn!x~u%GbfSN} z6X~9uHk;?G#=7IS-?c}5*}n@&d8?b}+n<~^4@XZP|GLEw)DQG|#CfuE!$2SetcW~7 z+2DyJlW0=3Lp(O$H7*-217yQpp?2%FTItBxfiU_~^xTg;KeltAFR#;+k(G5J{n?t* z9y9a9?rA7q+(LggxjVZhnA$;oAr;ST*l8_Y3#fH$xx`bzw+w7ybscWE$P7Y WX>RmwN3J9MlQkO5#5vu;BYy*R6a^>% literal 0 HcmV?d00001 diff --git a/tabler.wpf/Images/Icon-32.psd b/tabler.wpf/Images/Icon-32.psd new file mode 100644 index 0000000000000000000000000000000000000000..3a77822223088d456fef6e0313ef1f39aa76b129 GIT binary patch literal 61935 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 literal 0 HcmV?d00001 diff --git a/tabler.wpf/Properties/AssemblyInfo.cs b/tabler.wpf/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..5e6ee70 --- /dev/null +++ b/tabler.wpf/Properties/AssemblyInfo.cs @@ -0,0 +1,55 @@ +using System.Reflection; +using System.Resources; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Windows; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("tabler.wpf")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("tabler.wpf")] +[assembly: AssemblyCopyright("Copyright © 2019")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +//In order to begin building localizable applications, set +//CultureYouAreCodingWith in your .csproj file +//inside a . For example, if you are using US english +//in your source files, set the to en-US. Then uncomment +//the NeutralResourceLanguage attribute below. Update the "en-US" in +//the line below to match the UICulture setting in the project file. + +//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)] + + +[assembly: ThemeInfo( + ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located + //(used if a resource is not found in the page, + // or application resource dictionaries) + ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located + //(used if a resource is not found in the page, + // app, or any theme specific resource dictionaries) +)] + + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("0.0.0.1")] +[assembly: AssemblyFileVersion("0.0.0.1")] diff --git a/tabler.wpf/Properties/Resources.Designer.cs b/tabler.wpf/Properties/Resources.Designer.cs new file mode 100644 index 0000000..062d28e --- /dev/null +++ b/tabler.wpf/Properties/Resources.Designer.cs @@ -0,0 +1,244 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace tabler.wpf.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + public class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + public static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("tabler.wpf.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + public static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to Current version is up to date. + /// + public static string GridUI_CheckForNewVersion_Current_version_is_up_to_date { + get { + return ResourceManager.GetString("GridUI_CheckForNewVersion_Current_version_is_up_to_date", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Download the new version at. + /// + public static string GridUI_CheckForNewVersion_Download_the_new_version_at { + get { + return ResourceManager.GetString("GridUI_CheckForNewVersion_Download_the_new_version_at", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to New version available. + /// + public static string GridUI_CheckForNewVersion_New_version_available { + get { + return ResourceManager.GetString("GridUI_CheckForNewVersion_New_version_available", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Discard all changes?. + /// + public static string GridUI_Discard_all_changes { + get { + return ResourceManager.GetString("GridUI_Discard_all_changes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Duplicate Key(s) found. + ///Name: '{0}' + ///File: '{1}' + ///Entry: '{2}'. + /// + public static string GridUI_Duplicate_key_found { + get { + return ResourceManager.GetString("GridUI_Duplicate_key_found", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Duplicate Key Error. + /// + public static string GridUI_Duplicate_key_found_title { + get { + return ResourceManager.GetString("GridUI_Duplicate_key_found_title", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Exit?. + /// + public static string GridUI_Exit { + get { + return ResourceManager.GetString("GridUI_Exit", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Generic XML Exception. + ///Name: '{0}' + ///File: '{1}' + ///Entry: '{2}'. + /// + public static string GridUI_Generic_xml_exception { + get { + return ResourceManager.GetString("GridUI_Generic_xml_exception", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to XML Exception. + /// + public static string GridUI_Generic_xml_exception_title { + get { + return ResourceManager.GetString("GridUI_Generic_xml_exception_title", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Malformed Stringtable Encountered. + ///File: '{0}' + ///Message: '{1}' + /// + ///More information: https://community.bistudio.com/wiki/Stringtable.xml. + /// + public static string GridUI_Malformed_Stringtable_exception { + get { + return ResourceManager.GetString("GridUI_Malformed_Stringtable_exception", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Malformed Stringtable. + /// + public static string GridUI_Malformed_Stringtable_exception_title { + get { + return ResourceManager.GetString("GridUI_Malformed_Stringtable_exception_title", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to No 'stringtable.xml' files found.. + /// + public static string GridUI_No_stringtable_xml_files_found { + get { + return ResourceManager.GetString("GridUI_No_stringtable_xml_files_found", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Open?. + /// + public static string GridUI_Open { + get { + return ResourceManager.GetString("GridUI_Open", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Successfully saved.. + /// + public static string GridUI_saveToolStripMenuItem_Click_Successfully_saved { + get { + return ResourceManager.GetString("GridUI_saveToolStripMenuItem_Click_Successfully_saved", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to default hello world. + /// + public static string HelloWorld { + get { + return ResourceManager.GetString("HelloWorld", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Open language file(s). + /// + public static string MainUI_OpenFile { + get { + return ResourceManager.GetString("MainUI_OpenFile", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Save language file(s). + /// + public static string MainUI_SaveFile { + get { + return ResourceManager.GetString("MainUI_SaveFile", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Languages. + /// + public static string TranslationProgress_AxisX_Title { + get { + return ResourceManager.GetString("TranslationProgress_AxisX_Title", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Number of Missing Translations. + /// + public static string TranslationProgress_AxisY_Title { + get { + return ResourceManager.GetString("TranslationProgress_AxisY_Title", resourceCulture); + } + } + } +} diff --git a/tabler.wpf/Properties/Resources.de-DE.resx b/tabler.wpf/Properties/Resources.de-DE.resx new file mode 100644 index 0000000..39fe1c0 --- /dev/null +++ b/tabler.wpf/Properties/Resources.de-DE.resx @@ -0,0 +1,187 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Aktuelle Version ist auf dem neusten Stand + + + Neuere Version hier herunterladen + + + Neuere Version verfügbar + + + Änderungen verwerfen? + + + Doppelte(n) Key(s) gefunden. +Name: '{0}' +Datei: '{1}' +Eintrag: '{2}' + + + Doppelten Key gefunden + + + Beenden? + + + Allgemeiner XML-Fehler. +Name: '{0}' +Datei: '{1}' +Eintrag: '{2}' + + + XML-Fehler + + + Fehlerhaftes Format einer Stringtable-Datei gefunden. +Datei: '{0}' +Nachricht: '{1}' + +Mehr Informationen unter: https://community.bistudio.com/wiki/Stringtable.xml + + + Fehlerhaftes Stringtable Format + + + Keine 'stringtable.xml'-Dateien gefunden. + + + Öffnen? + + + Erfolgreich gespeichert + + + de helloworld + + + Datei(en) öffnen + + + Datei(en) speichern + + + Sprachen + + + Anzahl fehlender Übersetzungen + + \ No newline at end of file diff --git a/tabler.wpf/Properties/Resources.resx b/tabler.wpf/Properties/Resources.resx new file mode 100644 index 0000000..5d7ca20 --- /dev/null +++ b/tabler.wpf/Properties/Resources.resx @@ -0,0 +1,188 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Discard all changes? + + + Duplicate Key(s) found. +Name: '{0}' +File: '{1}' +Entry: '{2}' + + + Duplicate Key Error + + + Exit? + That's a question + + + Generic XML Exception. +Name: '{0}' +File: '{1}' +Entry: '{2}' + + + XML Exception + + + No 'stringtable.xml' files found. + + + New version available + + + Current version is up to date + + + Download the new version at + + + Successfully saved. + + + Languages + + + Number of Missing Translations + + + Malformed Stringtable Encountered. +File: '{0}' +Message: '{1}' + +More information: https://community.bistudio.com/wiki/Stringtable.xml + + + Malformed Stringtable + + + Open? + + + default hello world + + + Open language file(s) + + + Save language file(s) + + \ No newline at end of file diff --git a/tabler.wpf/Properties/Resources.ru-RU.resx b/tabler.wpf/Properties/Resources.ru-RU.resx new file mode 100644 index 0000000..d0c8522 --- /dev/null +++ b/tabler.wpf/Properties/Resources.ru-RU.resx @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Отменить все изменения? + + + Найден дублирующийся ключ. +Имя: '{0}' +Файл: '{1}' +Запись: '{2}' + + + Ошибка дублирующихся ключей + + + Выйти? + + + Общее XML-исключение. +Имя: '{0}' +Файл: '{1}' +Запись: '{2}' + + + XML-исключение + + + 'stringtable.xml' файлы не найдены. + + \ No newline at end of file diff --git a/tabler.wpf/Properties/Settings.Designer.cs b/tabler.wpf/Properties/Settings.Designer.cs new file mode 100644 index 0000000..6c9d016 --- /dev/null +++ b/tabler.wpf/Properties/Settings.Designer.cs @@ -0,0 +1,30 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace tabler.wpf.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/tabler.wpf/Properties/Settings.settings b/tabler.wpf/Properties/Settings.settings new file mode 100644 index 0000000..033d7a5 --- /dev/null +++ b/tabler.wpf/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/tabler.wpf/Windows/App.xaml b/tabler.wpf/Windows/App.xaml new file mode 100644 index 0000000..7213210 --- /dev/null +++ b/tabler.wpf/Windows/App.xaml @@ -0,0 +1,9 @@ + + + + + diff --git a/tabler.wpf/Windows/App.xaml.cs b/tabler.wpf/Windows/App.xaml.cs new file mode 100644 index 0000000..4b81ba7 --- /dev/null +++ b/tabler.wpf/Windows/App.xaml.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Configuration; +using System.Data; +using System.Linq; +using System.Threading.Tasks; +using System.Windows; + +namespace tabler.wpf +{ + /// + /// Interaction logic for App.xaml + /// + public partial class App : Application + { + } +} diff --git a/tabler.wpf/Windows/MainWindow.xaml b/tabler.wpf/Windows/MainWindow.xaml new file mode 100644 index 0000000..7df4149 --- /dev/null +++ b/tabler.wpf/Windows/MainWindow.xaml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tabler.wpf/Windows/MainWindow.xaml.cs b/tabler.wpf/Windows/MainWindow.xaml.cs new file mode 100644 index 0000000..ad3a818 --- /dev/null +++ b/tabler.wpf/Windows/MainWindow.xaml.cs @@ -0,0 +1,179 @@ +using Microsoft.WindowsAPICodePack.Dialogs; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Markup; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; +using tabler.Logic.Classes; +using tabler.Logic.Enums; +using tabler.Logic.Helper; +using tabler.wpf.Container; +using tabler.wpf.Controls; +using tabler.wpf.Helper; +using Control = System.Windows.Controls.Control; + +namespace tabler.wpf +{ + /// + /// Interaction logic for MainWindow.xaml + /// + public partial class MainWindow : Window + { + public readonly TranslationHelper TranslationHelper; + private ReleaseVersion _newerRelease; + + public MainWindow() + { + //The Internationalization Fix + FrameworkElement.LanguageProperty.OverrideMetadata(typeof(FrameworkElement), new FrameworkPropertyMetadata(XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag))); + + var culture = CultureInfo.GetCultureInfo(ConfigHelper.CurrentSettings.Language); + Dispatcher.Thread.CurrentCulture = culture; + Dispatcher.Thread.CurrentUICulture = culture; + + InitializeComponent(); + + Logger.LogMessageWithTypeArrived += ctrl_HelperLogMessages.AddMessage; + + TranslationHelper = new TranslationHelper(); + } + + private void btn_openLanguageFile(object sender, RoutedEventArgs e) + { + try + { + var dlg = new CommonOpenFileDialog(); + dlg.Title = "Select mod/mission folder, all stringtable.xml files in subfolders will be opened."; + dlg.IsFolderPicker = true; + dlg.AddToMostRecentlyUsedList = true; + dlg.AllowNonFileSystemItems = false; + dlg.DefaultDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyComputer); + dlg.EnsureFileExists = true; + dlg.EnsurePathExists = true; + dlg.EnsureReadOnly = false; + dlg.EnsureValidNames = true; + dlg.Multiselect = false; + dlg.ShowPlacesList = true; + + if (!string.IsNullOrEmpty(ConfigHelper.CurrentSettings.LastPathOfDataFiles)) + { + dlg.InitialDirectory = ConfigHelper.CurrentSettings.LastPathOfDataFiles; + } + + var result = dlg.ShowDialog(); + + if (result == CommonFileDialogResult.Ok ) + { + ctrl_languageOverview.LoadDirectory(new DirectoryInfo(dlg.FileName));//);new System.IO.DirectoryInfo(@"I:\arbeit\GitHub\Mamilacan\tabler\tabler\tabler.wpf\ExampleData")); + if (ConfigHelper.CurrentSettings.LastPathOfDataFiles != dlg.FileName) + { + ConfigHelper.CurrentSettings.LastPathOfDataFiles = dlg.FileName; + ConfigHelper.SaveSettings(); + } + } + + //// OpenOpenModFolderDialog(); + //if (MessageBox.Show(Properties.Resources.GridUI_Discard_all_changes, Properties.Resources.GridUI_Open,MessageBoxButton.YesNo) == MessageBoxResult.Yes) + //{ + // OpenOpenModFolderDialog(); + //} + } + catch (Exception ex) + { + Logger.LogEx(ex); + } + } + + private void btn_SaveLanguageFile(object sender, RoutedEventArgs e) + { + + + + + } + + private void btn_checkForNewVersion(object sender, RoutedEventArgs e) + { + CheckForNewVersion(); + } + + private void CheckForNewVersion() + { + try + { + var gh = new GitHubVersionHelper(); + var productVersion = Assembly.GetExecutingAssembly().GetName().Version; + + _newerRelease = gh.CheckForNewVersion(productVersion.ToString()); + + if (_newerRelease != null) + { + mi_getNewVersion.Visibility = Visibility.Visible; + Logger.LogGeneral($"{Resources["GridUI_CheckForNewVersion_New_version_available"]} -> {_newerRelease.Version}"); + Logger.LogGeneral($"{Resources["GridUI_CheckForNewVersion_Download_the_new_version_at"]}: {_newerRelease.HtmlUrl}"); + } + else + { + mi_getNewVersion.Visibility = Visibility.Collapsed; + Logger.LogGeneral($"{Resources["GridUI_CheckForNewVersion_Current_version_is_up_to_date"]} {productVersion}"); + } + } + catch (Exception ex) + { + Logger.LogError("Error: " + ex.Message); + } + } + + //private void comboBoxLanguage_SelectionChanged(object sender, SelectionChangedEventArgs e) + //{ + // try + // { + // var selectedItem = comboBoxLanguage.SelectedItem as ComboBoxItem; + + // var culture = CultureInfo.GetCultureInfo(selectedItem.Tag as string); + // // Properties.Resources.ResourceManager.GetString("HelloWorld", culture); + // Dispatcher.Thread.CurrentCulture = culture; + // Dispatcher.Thread.CurrentUICulture = culture; + // } + // catch (Exception ex) + // { + + // Logger.LogError(ex.ToString()); + // } + + //} + + private void Window_Loaded(object sender, RoutedEventArgs e) + { + + + } + + private void languageSelected(object sender, RoutedEventArgs e) + { + var selectedItem = sender as Control; + ConfigHelper.CurrentSettings.Language = selectedItem.Tag as string; + ConfigHelper.SaveSettings(); + Logger.LogGeneral($"Language changed to: {ConfigHelper.CurrentSettings.Language}. Restart required."); + + } + + private void btn_exit_click(object sender, RoutedEventArgs e) + { + this.Close(); + } + } +} diff --git a/tabler.wpf/WpfBinding.pdf b/tabler.wpf/WpfBinding.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c61bfc2703442eaeb12ef766475bd01315aef998 GIT binary patch literal 311623 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 {y%RRXAnA-*I;92zUiQiA7F=PyChVX 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 -
- - - Menu - - -

- - - ace3public - -

- - - -
- -
- -
- - - -
- - - -
- -

- 16KB XML snippet created on July 6th 2015. - This file is private. -

- - - Actions - - - - - - -
-
<?xml version="1.0" encoding="utf-8"?>
-<Project name="ACE">
-    <Package name="Advanced_Ballistics">
-        <Key ID="STR_ACE_Advanced_Ballistics_WindInfoKey">
-            <English>Show Wind Info</English>
-            <Polish>Pokaż inf. o wietrze</Polish>
-            <Italian>Mostra indicazioni del vento</Italian>
-            <Russian>Показать информацию о ветре</Russian>
-            <French>Afficher les info sur le vent</French>
-            <Spanish>Mostrar información del viento</Spanish>
-            <German>Windinformationen anzeigen</German>
-            <Hungarian>Széladatok mutatása</Hungarian>
-            <Czech>Zobrazit informace o větru</Czech>
-            <Portuguese>Mostrar Informação do Vento</Portuguese>
-        </Key>
-        <Key ID="STR_ACE_Advanced_Ballistics_ProtractorKey">
-            <English>Show Protractor</English>
-            <Polish>Pokaż kątomierz</Polish>
-            <Italian>Mostra il rapportatore</Italian>
-            <Russian>Показать транспортир</Russian>
-            <French>Afficher le rapporteur</French>
-            <Spanish>Mostrar transportador</Spanish>
-            <German>Winkelmesser anzeigen</German>
-            <Hungarian>Szögmérő mutatása</Hungarian>
-            <Czech>Zobrazit úhloměr</Czech>
-            <Portuguese>Mostrar Transferidor</Portuguese>
-        </Key>
-        <Key ID="STR_ACE_Advanced_Ballistics_DisplayName">
-            <English>Advanced Ballistics</English>
-            <Polish>Zaawansowana balistyka</Polish>
-            <Spanish>Balística avanzada</Spanish>
-            <German>Erweiterte Ballistik</German>
-            <Czech>Pokročilá balistika</Czech>
-            <Portuguese>Balística avançada</Portuguese>
-        </Key>
-        <Key ID="STR_ACE_Advanced_Ballistics_enabled_DisplayName">
-            <English>Advanced Ballistics</English>
-            <Polish>Zaawansowana balistyka</Polish>
-            <Spanish>Balística avanzada</Spanish>
-            <German>Erweiterte Ballistik</German>
-            <Czech>Pokročilá balistika</Czech>
-            <Portuguese>Balística avançada</Portuguese>
-        </Key>
-        <Key ID="STR_ACE_Advanced_Ballistics_enabled_Description">
-            <English>Enables advanced ballistics</English>
-            <Polish>Aktywuje zaawansowaną balistykę</Polish>
-            <Spanish>Activa la balística avanzada</Spanish>
-            <German>Aktiviert die erweiterte Ballistik</German>
-            <Czech>Aktivuje pokročilou balistiku</Czech>
-            <Portuguese>Ativa balística avançada</Portuguese>
-        </Key>
-        <Key ID="STR_ACE_Advanced_Ballistics_simulateForSnipers_DisplayName">
-            <English>Enabled For Snipers</English>
-            <Spanish>Activada para francotiradores</Spanish>
-            <Polish>Akt. dla snajperów</Polish>
-            <German>Für Scharfschützen aktiviert</German>
-            <Czech>Povoleno pro odstřelovače</Czech>
-            <Portuguese>Ativar para caçadores</Portuguese>
-        </Key>
-        <Key ID="STR_ACE_Advanced_Ballistics_simulateForSnipers_Description">
-            <English>Enables advanced ballistics for non local snipers (when using high power optics)</English>
-            <Spanish>Activa la balística avanzada para francotiradores no locales (cuando se usa una mira telescópica)</Spanish>
-            <Polish>Aktywuje zaawansowaną balistykę dla nielokalnych snajperów (kiedy używają optyki)</Polish>
-            <German>Aktiviert die erweiterte Ballistik für nicht lokale Scharfschützen (bei Benutzung von Optiken mit starker Vergrößerung)</German>
-            <Czech>Aktivuje pokročilou balistiku pro nelokální odstřelovače (když používá výkonnou optiku)</Czech>
-            <Portuguese>Ativa balística avançada para caçadores não locais (quando usando miras telescópicas)</Portuguese>
-        </Key>
-        <Key ID="STR_ACE_Advanced_Ballistics_simulateForGroupMembers_DisplayName">
-            <English>Enabled For Group Members</English>
-            <Spanish>Activada para miembros de grupo</Spanish>
-            <Polish>Akt. dla czł. grupy</Polish>
-            <German>Für Gruppenmitglieder aktiviert</German>
-            <Czech>Povoleno pro členy skupiny</Czech>
-            <Portuguese>Ativada para membros do grupo</Portuguese>
-        </Key>
-        <Key ID="STR_ACE_Advanced_Ballistics_simulateForGroupMembers_Description">
-            <English>Enables advanced ballistics for non local group members</English>
-            <Spanish>Activada la balística avanzada para miembros de grupo no locales</Spanish>
-            <Polish>Aktywuje zaawansowaną balistykę dla nielokalnych członków grupy</Polish>
-            <German>Aktiviert die erweiterte Ballistik für nicht lokale Gruppenmitglieder</German>
-            <Czech>Aktivuje pokročilou balistiku pro nelokální členy skupiny</Czech>
-            <Portuguese>Ativa balística avançada para membros de grupo não locais</Portuguese>
-        </Key>
-        <Key ID="STR_ACE_Advanced_Ballistics_simulateForEveryone_DisplayName">
-            <English>Enabled For Everyone</English>
-            <Spanish>Activada para todos</Spanish>
-            <Polish>Akt. dla wszystkich</Polish>
-            <German>Für jeden aktiviert</German>
-            <Czech>Povoleno pro všechny</Czech>
-            <Portuguese>Ativada para todos</Portuguese>
-        </Key>
-        <Key ID="STR_ACE_Advanced_Ballistics_simulateForEveryone_Description">
-            <English>Enables advanced ballistics for all non local players (enabling this may degrade performance during heavy firefights in multiplayer)</English>
-            <Spanish>Activada la balística avanzada para todos los jugadores no locales (activarlo puede degradar el rendimiento durante grandes tiroteos en multijugador).</Spanish>
-            <Polish>Aktywuje zaawansowaną balistykę dla wszystkich nielokalnych graczy (aktywacja tej opcji może spodowować spory spadek wydajności podczas ciężkiej wymiany ognia)</Polish>
-            <German>Aktiviert die erweiterte Ballistik für alle nicht lokalen Spieler (das Aktivieren dieser Funktion kann zur Beeinträchtigung des Spielerlebnisses im Multiplayer führen)</German>
-            <Czech>Aktivovat pokročilou balistiku pro všechny nelokální hráče (aktivace této možnosti způsobuje pokles snímu za sekundu během těžké přestřelky v multiplayeru)</Czech>
-            <Portuguese>Ativa balística avançada para todos os jogadores não locais (ativando isso pode degradar a performance durante troca de tiros intensas no multiplayer)</Portuguese>
-        </Key>
-        <Key ID="STR_ACE_Advanced_Ballistics_alwaysSimulateForGroupMembers_DisplayName">
-            <English>Always Enabled For Group Members</English>
-            <Polish>Zawsze akt. dla czł. grupy</Polish>
-            <Spanish>Siempre activada para miembros de grupo</Spanish>
-            <German>Für Gruppenmitglieder immer aktiviert</German>
-            <Czech>Vždy povoleno pro členy skupiny</Czech>
-            <Portuguese>Sempre ativada para membros do grupo</Portuguese>
-        </Key>
-        <Key ID="STR_ACE_Advanced_Ballistics_alwaysSimulateForGroupMembers_Description">
-            <English>Always enables advanced ballistics when a group member fires</English>
-            <Polish>Aktywuje zaawansowaną balistykę dla wszystkich członków grupy</Polish>
-            <Spanish>Activada la balística avanzada siempre cuando miembros de grupo disparan</Spanish>
-            <German>Aktiviert die erweiterte Ballistik immer, wenn ein Gruppenmitglied schießt</German>
-            <Czech>Aktivuje pokročilou balistiku pro členy skupiny</Czech>
-            <Portuguese>Sempre ative balística avançada quando um membro do grupo disparar</Portuguese>
-        </Key>
-        <Key ID="STR_ACE_Advanced_Ballistics_disabledInFullAutoMod_DisplayName">
-            <English>Disabled In FullAuto Mode</English>
-            <Polish>Wył. podczas ognia auto.</Polish>
-            <Spanish>Desactivada en modo automático</Spanish>
-            <German>Beim vollautomatischen Feuern deaktiviert</German>
-            <Czech>Zakázáno v automatickém režimu střelby</Czech>
-            <Portuguese>Desabilitar no modo automático</Portuguese>
-        </Key>
-        <Key ID="STR_ACE_Advanced_Ballistics_disabledInFullAutoMod_Description">
-            <English>Disables the advanced ballistics during full auto fire</English>
-            <Polish>Dezaktywuje zaawansowaną balistykę podczas ognia automatycznego</Polish>
-            <Spanish>Desactivada la balística avanzada durante el fuego automático</Spanish>
-            <German>Deaktiviert die erweiterte Ballistik beim vollautomatischen Feuern</German>
-            <Czech>Zákáže pokročilou balistiku během střelby v režimu automat</Czech>
-            <Portuguese>Desabilitar a balística avançada durante fogo automático</Portuguese>
-        </Key>
-        <Key ID="STR_ACE_Advanced_Ballistics_ammoTemperatureEnabled_DisplayName">
-            <English>Enable Ammo Temperature Simulation</English>
-            <Polish>Symulacja temp. amunicji</Polish>
-            <Spanish>Activar simulación de temperatura de munición</Spanish>
-            <German>Simulation der Munitionstemperatur aktivieren</German>
-            <Czech>Povolit simulaci teploty munice</Czech>
-            <Portuguese>Ativar simulação de temperatura de munição</Portuguese>
-        </Key>
-        <Key ID="STR_ACE_Advanced_Ballistics_ammoTemperatureEnabled_Description">
-            <English>Muzzle velocity varies with ammo temperature</English>
-            <Polish>Prędkość wylotowa pocisku jest zależna od temperatury amunicji</Polish>
-            <Spanish>La velocidad de salida varía con la temperatura de la munición</Spanish>
-            <German>Munitionstemperatur hat Einfluss auf die Mündungsgeschwindigkeit</German>
-            <Czech>Úsťová rychlost je závislá na teplotě munice</Czech>
-            <Portuguese>A velocidade de saída varia com a temperatura da munição</Portuguese>
-        </Key>
-        <Key ID="STR_ACE_Advanced_Ballistics_barrelLengthInfluenceEnabled_DisplayName">
-            <English>Enable Barrel Length Simulation</English>
-            <Polish>Symulacja długości lufy</Polish>
-            <Spanish>Habilitar la simulación de longitud del cañón</Spanish>
-            <German>Simulation der Lauflänge aktivieren</German>
-            <Czech>Povolit simulaci délky hlavně</Czech>
-            <Portuguese>Ativar a simulação de comprimento do cano</Portuguese>
-        </Key>
-        <Key ID="STR_ACE_Advanced_Ballistics_barrelLengthInfluenceEnabled_Description">
-            <English>Muzzle velocity varies with barrel length</English>
-            <Polish>Prędkość wylotowa pocisku jest zależna od długości lufy</Polish>
-            <Spanish>La velocidad de salidal varía con la longitud del cañón</Spanish>
-            <German>Lauflänge beeinflusst Mündungsgeschwindigkeit</German>
-            <Czech>Úsťová rychlost je závislá na délce hlavně</Czech>
-            <Portuguese>A velocidade de saída caria com o comprimento do cano</Portuguese>
-        </Key>
-        <Key ID="STR_ACE_Advanced_Ballistics_bulletTraceEnabled_DisplayName">
-            <English>Enable Bullet Trace Effect</English>
-            <Polish>Efekt smugi pocisku</Polish>
-            <Spanish>Activar el efecto trazador de la bala</Spanish>
-            <German>Geschossspureffekt aktivieren</German>
-            <Czech>Povolit efekt trasírek</Czech>
-            <Portuguese>Ativa efeito traçante de projétil</Portuguese>
-        </Key>
-        <Key ID="STR_ACE_Advanced_Ballistics_bulletTraceEnabled_Description">
-            <English>Enables a bullet trace effect to high caliber bullets (only visible when looking through high power optics)</English>
-            <Polish>Aktywuje efekt smugi pocisku dla pocisków wysokokalibrowych (widoczne tylko podczas patrzenia przez optykę)</Polish>
-            <Spanish>Activa el efecto trazador de la balas de gran calibre (solo visible cuando se mira a través de una mira telescópica)</Spanish>
-            <German>Aktiviere Geschossspureffekt für hohe Kaliber (bei Benutzung von Optiken mit starker Vergrößerung)</German>
-            <Czech>Aktivuje efekt trasírek z vysokokaliberních zbraní (viditelné pouze skrze výkonnou optiku)</Czech>
-            <Portuguese>Ativa o efeito traçante de projétil para projéteis de alto calibre (somente visível quando observado por miras telescópicas)</Portuguese>
-        </Key>
-        <Key ID="STR_ACE_Advanced_Ballistics_simulationInterval_DisplayName">
-            <English>Simulation Interval</English>
-            <Polish>Interwał symulacji</Polish>
-            <Spanish>Intervalo de simulación</Spanish>
-            <German>Simulationsintervall</German>
-            <Czech>Interval simulace</Czech>
-            <Portuguese>Intervalo da simulação</Portuguese>
-        </Key>
-        <Key ID="STR_ACE_Advanced_Ballistics_simulationInterval_Description">
-            <English>Defines the interval between every calculation step</English>
-            <Polish>Określa interwał pomiędzy każdym krokiem kalkulacji</Polish>
-            <Spanish>Define el intervalo entre cada cálculo</Spanish>
-            <German>Legt das Intervall zwischen den Berechnungsschritten fest</German>
-            <Czech>Určuje interval mezi každým výpočtem</Czech>
-            <Portuguese>Define o intervalo entre cada cálculo</Portuguese>
-        </Key>
-        <Key ID="STR_ACE_Advanced_Ballistics_simulationRadius_DisplayName">
-            <English>Simulation Radius</English>
-            <Polish>Zasięg symulacji</Polish>
-            <Spanish>Radio de simulación</Spanish>
-            <German>Simulationsradius</German>
-            <Czech>Rozsah simulace</Czech>
-            <Portuguese>Raio de simulação</Portuguese>
-        </Key>
-        <Key ID="STR_ACE_Advanced_Ballistics_simulationRadius_Description">
-            <English>Defines the radius around the player (in meters) at which advanced ballistics are applied to projectiles</English>
-            <Polish>Określa obszar naokoło gracza (w metrach), na którym zaawansowana balistyka jest aplikowana dla pocisków</Polish>
-            <Spanish>Define el radio alrededor del jugador (en metros) en el cual se aplica la balística avanzada a los proyectiles</Spanish>
-            <German>Gibt den Radius (in Metern) um den Spieler an, bei dem die erweiterte Ballistik auf Geschosse angewendet wird</German>
-            <Czech>Určuje oblast kolem hráče (v metrech), kde je pokročilá balistika použita na projektil</Czech>
-            <Portuguese>Define o raio ao redor do jogador (em metros) onde a balística avançada será aplicada aos projéteis</Portuguese>
-        </Key>
-        <Key ID="STR_ACE_Advanced_Ballistics_Description">
-            <English></English>
-            <Polish>Moduł ten pozwala aktywować zaawansowaną balistykę biorącą przy obliczeniach trajektorii lotu pocisku pod uwagę takie rzeczy jak temperatura powietrza, ciśnienie atmosferyczne, wilgotność powietrza, siły Coriolisa i Eotvosa, grawitację a także broń z jakiej wykonywany jest strzał oraz rodzaj amunicji. Wszystko to sprowadza się na bardzo dokładne odwzorowanie balistyki.</Polish>
-            <Czech>Tento modul umožňuje aktivovat pokročilou balistiku, která vypočítává trajektorii kulky a bere do úvahy věci jako je teplota vzduchu, atmosférický tlak, vlhkost vzduchu, gravitaci, typ munice a zbraň, ze které je náboj vystřelen. To vše přispívá k velmi přesné balistice.</Czech>
-            <Portuguese>Este módulo permite que você ative cálculos de balística avançada, fazendo a trajetória do projétil levar em consideração coisas como temperatura do ar, pressão atmosférica, umidade, força de Coriolis, a gravidade, o modelo da arma no qual o disparo é realizado e o tipo de munição. Tudo isso acrescenta-se a um balística muito precisa.</Portuguese>
-        </Key>
-    </Package>
-</Project>
- -

- -

- -
- -
-
-
-
-
-
- - - - - - - - cmd+enter to submit -
- - -
-
-
-
- - - - -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + + + Show Wind Info + Pokaż inf. o wietrze + Mostra indicazioni del vento + Показать информацию о ветре + Afficher les info sur le vent + Mostrar información del viento + Windinformationen anzeigen + Széladatok mutatása + Zobrazit informace o větru + Mostrar Informação do Vento + + + Show Protractor + Pokaż kątomierz + Mostra il rapportatore + Показать транспортир + Afficher le rapporteur + Mostrar transportador + Winkelmesser anzeigen + Szögmérő mutatása + Zobrazit úhloměr + Mostrar Transferidor + + + Advanced Ballistics + Zaawansowana balistyka + Balística avanzada + Erweiterte Ballistik + Pokročilá balistika + Balística avançada + + + Advanced Ballistics + Zaawansowana balistyka + Balística avanzada + Erweiterte Ballistik + Pokročilá balistika + Balística avançada + + + Enables advanced ballistics + Aktywuje zaawansowaną balistykę + Activa la balística avanzada + Aktiviert die erweiterte Ballistik + Aktivuje pokročilou balistiku + Ativa balística avançada + + + Enabled For Snipers + Activada para francotiradores + Akt. dla snajperów + Für Scharfschützen aktiviert + Povoleno pro odstřelovače + Ativar para caçadores + + + Enables advanced ballistics for non local snipers (when using high power optics) + Activa la balística avanzada para francotiradores no locales (cuando se usa una mira telescópica) + Aktywuje zaawansowaną balistykę dla nielokalnych snajperów (kiedy używają optyki) + Aktiviert die erweiterte Ballistik für nicht lokale Scharfschützen (bei Benutzung von Optiken mit starker Vergrößerung) + Aktivuje pokročilou balistiku pro nelokální odstřelovače (když používá výkonnou optiku) + Ativa balística avançada para caçadores não locais (quando usando miras telescópicas) + + + Enabled For Group Members + Activada para miembros de grupo + Akt. dla czł. grupy + Für Gruppenmitglieder aktiviert + Povoleno pro členy skupiny + Ativada para membros do grupo + + + Enables advanced ballistics for non local group members + Activada la balística avanzada para miembros de grupo no locales + Aktywuje zaawansowaną balistykę dla nielokalnych członków grupy + Aktiviert die erweiterte Ballistik für nicht lokale Gruppenmitglieder + Aktivuje pokročilou balistiku pro nelokální členy skupiny + Ativa balística avançada para membros de grupo não locais + + + Enabled For Everyone + Activada para todos + Akt. dla wszystkich + Für jeden aktiviert + Povoleno pro všechny + Ativada para todos + + + Enables advanced ballistics for all non local players (enabling this may degrade performance during heavy firefights in multiplayer) + Activada la balística avanzada para todos los jugadores no locales (activarlo puede degradar el rendimiento durante grandes tiroteos en multijugador). + Aktywuje zaawansowaną balistykę dla wszystkich nielokalnych graczy (aktywacja tej opcji może spodowować spory spadek wydajności podczas ciężkiej wymiany ognia) + Aktiviert die erweiterte Ballistik für alle nicht lokalen Spieler (das Aktivieren dieser Funktion kann zur Beeinträchtigung des Spielerlebnisses im Multiplayer führen) + Aktivovat pokročilou balistiku pro všechny nelokální hráče (aktivace této možnosti způsobuje pokles snímu za sekundu během těžké přestřelky v multiplayeru) + Ativa balística avançada para todos os jogadores não locais (ativando isso pode degradar a performance durante troca de tiros intensas no multiplayer) + + + Always Enabled For Group Members + Zawsze akt. dla czł. grupy + Siempre activada para miembros de grupo + Für Gruppenmitglieder immer aktiviert + Vždy povoleno pro členy skupiny + Sempre ativada para membros do grupo + + + Always enables advanced ballistics when a group member fires + Aktywuje zaawansowaną balistykę dla wszystkich członków grupy + Activada la balística avanzada siempre cuando miembros de grupo disparan + Aktiviert die erweiterte Ballistik immer, wenn ein Gruppenmitglied schießt + Aktivuje pokročilou balistiku pro členy skupiny + Sempre ative balística avançada quando um membro do grupo disparar + + + Disabled In FullAuto Mode + Wył. podczas ognia auto. + Desactivada en modo automático + Beim vollautomatischen Feuern deaktiviert + Zakázáno v automatickém režimu střelby + Desabilitar no modo automático + + + Disables the advanced ballistics during full auto fire + Dezaktywuje zaawansowaną balistykę podczas ognia automatycznego + Desactivada la balística avanzada durante el fuego automático + Deaktiviert die erweiterte Ballistik beim vollautomatischen Feuern + Zákáže pokročilou balistiku během střelby v režimu automat + Desabilitar a balística avançada durante fogo automático + + + Enable Ammo Temperature Simulation + Symulacja temp. amunicji + Activar simulación de temperatura de munición + Simulation der Munitionstemperatur aktivieren + Povolit simulaci teploty munice + Ativar simulação de temperatura de munição + + + Muzzle velocity varies with ammo temperature + Prędkość wylotowa pocisku jest zależna od temperatury amunicji + La velocidad de salida varía con la temperatura de la munición + Munitionstemperatur hat Einfluss auf die Mündungsgeschwindigkeit + Úsťová rychlost je závislá na teplotě munice + A velocidade de saída varia com a temperatura da munição + + + Enable Barrel Length Simulation + Symulacja długości lufy + Habilitar la simulación de longitud del cañón + Simulation der Lauflänge aktivieren + Povolit simulaci délky hlavně + Ativar a simulação de comprimento do cano + + + Muzzle velocity varies with barrel length + Prędkość wylotowa pocisku jest zależna od długości lufy + La velocidad de salidal varía con la longitud del cañón + Lauflänge beeinflusst Mündungsgeschwindigkeit + Úsťová rychlost je závislá na délce hlavně + A velocidade de saída caria com o comprimento do cano + + + Enable Bullet Trace Effect + Efekt smugi pocisku + Activar el efecto trazador de la bala + Geschossspureffekt aktivieren + Povolit efekt trasírek + Ativa efeito traçante de projétil + + + Enables a bullet trace effect to high caliber bullets (only visible when looking through high power optics) + Aktywuje efekt smugi pocisku dla pocisków wysokokalibrowych (widoczne tylko podczas patrzenia przez optykę) + Activa el efecto trazador de la balas de gran calibre (solo visible cuando se mira a través de una mira telescópica) + Aktiviere Geschossspureffekt für hohe Kaliber (bei Benutzung von Optiken mit starker Vergrößerung) + Aktivuje efekt trasírek z vysokokaliberních zbraní (viditelné pouze skrze výkonnou optiku) + Ativa o efeito traçante de projétil para projéteis de alto calibre (somente visível quando observado por miras telescópicas) + + + Simulation Interval + Interwał symulacji + Intervalo de simulación + Simulationsintervall + Interval simulace + Intervalo da simulação + + + Defines the interval between every calculation step + Określa interwał pomiędzy każdym krokiem kalkulacji + Define el intervalo entre cada cálculo + Legt das Intervall zwischen den Berechnungsschritten fest + Určuje interval mezi každým výpočtem + Define o intervalo entre cada cálculo + + + Simulation Radius + Zasięg symulacji + Radio de simulación + Simulationsradius + Rozsah simulace + Raio de simulação + + + Defines the radius around the player (in meters) at which advanced ballistics are applied to projectiles + Określa obszar naokoło gracza (w metrach), na którym zaawansowana balistyka jest aplikowana dla pocisków + Define el radio alrededor del jugador (en metros) en el cual se aplica la balística avanzada a los proyectiles + Gibt den Radius (in Metern) um den Spieler an, bei dem die erweiterte Ballistik auf Geschosse angewendet wird + Určuje oblast kolem hráče (v metrech), kde je pokročilá balistika použita na projektil + Define o raio ao redor do jogador (em metros) onde a balística avançada será aplicada aos projéteis + + + + Moduł ten pozwala aktywować zaawansowaną balistykę biorącą przy obliczeniach trajektorii lotu pocisku pod uwagę takie rzeczy jak temperatura powietrza, ciśnienie atmosferyczne, wilgotność powietrza, siły Coriolisa i Eotvosa, grawitację a także broń z jakiej wykonywany jest strzał oraz rodzaj amunicji. Wszystko to sprowadza się na bardzo dokładne odwzorowanie balistyki. + Tento modul umožňuje aktivovat pokročilou balistiku, která vypočítává trajektorii kulky a bere do úvahy věci jako je teplota vzduchu, atmosférický tlak, vlhkost vzduchu, gravitaci, typ munice a zbraň, ze které je náboj vystřelen. To vše přispívá k velmi přesné balistice. + Este módulo permite que você ative cálculos de balística avançada, fazendo a trajetória do projétil levar em consideração coisas como temperatura do ar, pressão atmosférica, umidade, força de Coriolis, a gravidade, o modelo da arma no qual o disparo é realizado e o tipo de munição. Tudo isso acrescenta-se a um balística muito precisa. + + + \ No newline at end of file diff --git a/tabler/tabler.csproj b/tabler/tabler.csproj index 5058a7c..711d386 100644 --- a/tabler/tabler.csproj +++ b/tabler/tabler.csproj @@ -97,7 +97,6 @@

I3n&;$jt?C#;gIC)eEhW0J<|Lt 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%0D<|AT+J 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%0D1Ahmh94%#D$dK!FdErtjEPCH1J= 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 literal 0 HcmV?d00001 diff --git a/tabler.wpf/packages.config b/tabler.wpf/packages.config new file mode 100644 index 0000000..849a0a1 --- /dev/null +++ b/tabler.wpf/packages.config @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/tabler.wpf/tabler.wpf.csproj b/tabler.wpf/tabler.wpf.csproj new file mode 100644 index 0000000..f2d2d2f --- /dev/null +++ b/tabler.wpf/tabler.wpf.csproj @@ -0,0 +1,231 @@ + + + + + Debug + AnyCPU + {A6677EF8-6AB9-4976-A218-89470EE4B9C9} + WinExe + tabler.wpf + tabler.wpf + v4.7.2 + 512 + {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + 4 + true + true + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + true + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + tabler.wpf.App + + + + ..\packages\SharpZipLib.1.2.0\lib\net45\ICSharpCode.SharpZipLib.dll + + + ..\packages\Microsoft-WindowsAPICodePack-Core.1.1.3.3\lib\net452\Microsoft.WindowsAPICodePack.dll + + + ..\packages\Microsoft-WindowsAPICodePack-Shell.1.1.3.3\lib\net452\Microsoft.WindowsAPICodePack.Shell.dll + + + ..\packages\SharpSerializer.3.0.1\lib\net452\Polenter.SharpSerializer.dll + + + + + + + + + + + + + + 4.0 + + + + + + + + MSBuild:Compile + Designer + + + MSBuild:Compile + Designer + + + MSBuild:Compile + Designer + + + MSBuild:Compile + Designer + + + MSBuild:Compile + Designer + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + MSBuild:Compile + Designer + + + Designer + MSBuild:Compile + + + MSBuild:Compile + Designer + + + + + Helper_LabelTextBox.xaml + + + Helper_LogMessages.xaml + + + Helper_ProgressBar.xaml + + + + + ItemSelectControl.xaml + + + TranslationFileOverviewControl.xaml + + + LogMessages_Window.xaml + + + TranslationFileSingleControl.xaml + + + + + + + + + + + App.xaml + Code + + + + + + + + + + + + + + General_VersionInfo.xaml + + + + + + + MainWindow.xaml + Code + + + + + Code + + + True + True + Resources.resx + + + True + Settings.settings + True + + + + PublicResXFileCodeGenerator + Resources.Designer.cs + Designer + + + + + + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + + + + + + + + + + + + + + + + {651801fa-f7ae-4f9b-9a7c-2ddea5965440} + tabler.Logic + + + + + + + + + + + \ No newline at end of file diff --git a/tabler.wpf/xaml_codehelper.xml b/tabler.wpf/xaml_codehelper.xml new file mode 100644 index 0000000..dd633a0 --- /dev/null +++ b/tabler.wpf/xaml_codehelper.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/tabler/Classes/Logger.cs b/tabler/Classes/Logger.cs deleted file mode 100644 index d9c35cc..0000000 --- a/tabler/Classes/Logger.cs +++ /dev/null @@ -1,53 +0,0 @@ -using System; -using System.Text; -using System.Timers; -using System.Windows.Forms; -using Timer = System.Timers.Timer; - -namespace tabler.Classes -{ - public static class Logger - { - private static readonly StringBuilder StringBuilderForLogging = new StringBuilder(); - public static TextBox TextBoxToLogIn; - - private static Timer _timer; - - public static void ClearLog() - { - StringBuilderForLogging.Clear(); - } - - public static void Log(string message) - { - if (TextBoxToLogIn == null) - { - return; - } - - if (_timer == null) - { - _timer = new Timer {Interval = 500}; - _timer.Elapsed += timer_Elapsed; - } - - StringBuilderForLogging.Insert(0, DateTime.Now.ToString("yyyy.MM.dd hh:mm:ss") + " - " + message + Environment.NewLine); - _timer.Start(); - } - - private static void timer_Elapsed(object sender, ElapsedEventArgs e) - { - _timer.Stop(); - - if (TextBoxToLogIn == null) - { - _timer.Start(); - } - - TextBoxToLogIn.UiThread(delegate { TextBoxToLogIn.Text = StringBuilderForLogging.ToString(); }); - - - _timer.Start(); - } - } -} diff --git a/tabler/Forms/GridUI.cs b/tabler/Forms/GridUI.cs index 9909935..c536d40 100644 --- a/tabler/Forms/GridUI.cs +++ b/tabler/Forms/GridUI.cs @@ -17,7 +17,7 @@ namespace tabler { public partial class GridUI : Form { - private readonly ConfigHelper _configHelper; + public readonly TranslationHelper TranslationHelper; private GridUiHelper _gridUiHelper; private ReleaseVersion _newerRelease; @@ -27,9 +27,9 @@ public partial class GridUI : Form public GridUI() { InitializeComponent(); - _configHelper = new ConfigHelper(); + TranslationHelper = new TranslationHelper(); - Logger.TextBoxToLogIn = _tbLog; + } @@ -86,7 +86,7 @@ private void saveToolStripMenuItem_Click(object sender, EventArgs e) // start the process WaitingForm.ShowForm(this); - success = TranslationHelper.SaveGridData(_configHelper.GetLastPathOfDataFiles(), stringtables); + success = TranslationHelper.SaveGridData(new DirectoryInfo(ConfigHelper.CurrentSettings.LastPathOfDataFiles), stringtables); WaitingForm.CloseForm(); } @@ -230,21 +230,14 @@ private void hideTranslatedRowsToolStripMenuItem_Click(object sender, EventArgs private void OpenOpenModFolderDialog() { var curPath = ""; - - var lastPath = _configHelper.GetLastPathOfDataFiles(); - - if (lastPath != null) - { - curPath = lastPath.FullName; - } - + curPath = ConfigHelper.CurrentSettings.LastPathOfDataFiles; + var folderDialog = new CommonOpenFileDialog {IsFolderPicker = true}; if (string.IsNullOrEmpty(curPath) == false) { folderDialog.DefaultDirectory = curPath; } - if (folderDialog.ShowDialog() == CommonFileDialogResult.Ok) { tbModFolder.Text = folderDialog.FileName; @@ -286,8 +279,7 @@ private void StartParsingProcess(string folderName) removeLanguageToolStripMenuItem.Enabled = true; statisticsToolStripMenuItem.Enabled = true; - _configHelper.SetLastPathOfDataFiles(new DirectoryInfo(folderName)); - + ConfigHelper.CurrentSettings.LastPathOfDataFiles = folderName; _stringtablesLoaded = true; } catch (AggregateException ae) diff --git a/tabler/Forms/SettingsForm.cs b/tabler/Forms/SettingsForm.cs index e825b7f..f0278a7 100644 --- a/tabler/Forms/SettingsForm.cs +++ b/tabler/Forms/SettingsForm.cs @@ -27,19 +27,13 @@ protected override bool ProcessCmdKey(ref Message msg, Keys keyData) private void Settings_Load(object sender, EventArgs e) { - var configHelper = new ConfigHelper(); - - var settings = configHelper.GetSettings(); - - if (settings != null) - { - if (settings.IndentationSettings == IndentationSettings.Tabs) + if (ConfigHelper.CurrentSettings.IndentationSettings == IndentationSettings.Tabs) { rbIndentTabs.Checked = true; } - tbIndentation.Text = settings.TabSize.ToString(); - } + tbIndentation.Text = ConfigHelper.CurrentSettings.TabSize.ToString(); + } @@ -56,22 +50,19 @@ private void rbIndentTabs_CheckedChanged(object sender, EventArgs e) private void btnSaveSettings_Click(object sender, EventArgs e) { - var configHelper = new ConfigHelper(); - var newSettings = new Settings(); - if (rbIndentTabs.Checked) { - newSettings.IndentationSettings = IndentationSettings.Tabs; + ConfigHelper.CurrentSettings.IndentationSettings = IndentationSettings.Tabs; } if (rbIndentSpaces.Checked) { - newSettings.IndentationSettings = IndentationSettings.Spaces; + ConfigHelper.CurrentSettings.IndentationSettings = IndentationSettings.Spaces; //newSettings.TabSize = int tabSizeValue; if (int.TryParse(tbIndentation.Text, out tabSizeValue)) { - newSettings.TabSize = tabSizeValue; + ConfigHelper.CurrentSettings.TabSize = tabSizeValue; } else { @@ -79,8 +70,7 @@ private void btnSaveSettings_Click(object sender, EventArgs e) return; } } - - configHelper.SaveSettings(newSettings); + ConfigHelper.SaveSettings(); Close(); } } diff --git a/tabler/data/stringtable.xml b/tabler/data/stringtable.xml index ab424b7..6fa81f3 100644 --- a/tabler/data/stringtable.xml +++ b/tabler/data/stringtable.xml @@ -1,802 +1,219 @@ - - - - - - - - - - - - - - - - - - - - - stringtable.xml | ace3public Slack - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

- Form From d94e78ac262ee1b3341d5193d15e4ac324fdb058 Mon Sep 17 00:00:00 2001 From: MaMilaCan Date: Fri, 8 Nov 2019 18:28:39 +0100 Subject: [PATCH 2/3] Basic functions done Basic functions done --- tabler.Logic/Classes/Key.cs | 16 +- tabler.Logic/Classes/Package.cs | 8 +- tabler.Logic/Classes/Project.cs | 51 +++- tabler.Logic/Helper/StringtableHelper.cs | 53 ++--- .../Key_ExtendedWithChangeTracking.cs | 78 ++++-- .../TranslationFileSingleControl.xaml | 20 +- .../TranslationFileSingleControl.xaml.cs | 199 +++++++++++++--- tabler.wpf/ExampleData/TEST.xml | 225 ++++++++++++++++++ tabler.wpf/ExampleData/TEST.xmlFILE | 1 + tabler.wpf/Helper/ClipBoardHelper.cs | 17 +- .../Helper/Converter/ValueToBrushConverter.cs | 43 ++-- tabler.wpf/tabler.wpf.csproj | 1 + 12 files changed, 569 insertions(+), 143 deletions(-) create mode 100644 tabler.wpf/ExampleData/TEST.xml create mode 100644 tabler.wpf/ExampleData/TEST.xmlFILE diff --git a/tabler.Logic/Classes/Key.cs b/tabler.Logic/Classes/Key.cs index cf2f36b..27e935d 100644 --- a/tabler.Logic/Classes/Key.cs +++ b/tabler.Logic/Classes/Key.cs @@ -65,14 +65,14 @@ public class Key [DataMember] public string Korean { get; set; } - [IgnoreDataMember] - [XmlIgnore] - [SoapIgnore] - public string PackageName { get; set; } - [IgnoreDataMember] - [XmlIgnore] - [SoapIgnore] - public string ContainerName { get; set; } + //[IgnoreDataMember] + //[XmlIgnore] + //[SoapIgnore] + //public string PackageName { get; set; } + //[IgnoreDataMember] + //[XmlIgnore] + //[SoapIgnore] + //public string ContainerName { get; set; } //[IgnoreDataMember] //[XmlIgnore] diff --git a/tabler.Logic/Classes/Package.cs b/tabler.Logic/Classes/Package.cs index cb2dfee..8279ec9 100644 --- a/tabler.Logic/Classes/Package.cs +++ b/tabler.Logic/Classes/Package.cs @@ -16,9 +16,9 @@ public class Package { [XmlElement("Key")] public List Keys { get; set; } - internal XElement AsXElement(bool ignoreEmptyValues, List languagesToWrite) - { - return new XElement("Package", new XAttribute("name", Name), Keys.Select(x => x.AsXElement( ignoreEmptyValues, languagesToWrite)).ToList()); - } + //internal XElement AsXElement(bool ignoreEmptyValues, List languagesToWrite) + //{ + // return new XElement("Package", new XAttribute("name", Name), Keys.Select(x => x.AsXElement( ignoreEmptyValues, languagesToWrite)).ToList()); + //} } } diff --git a/tabler.Logic/Classes/Project.cs b/tabler.Logic/Classes/Project.cs index 0038545..b3bc6a2 100644 --- a/tabler.Logic/Classes/Project.cs +++ b/tabler.Logic/Classes/Project.cs @@ -14,10 +14,53 @@ public class Project { [XmlElement("Package")] public List Packages { get; set; } - public XElement AsXelement(bool ignoreEmptyValues, List languagesToWrite) - { - return new XElement("Project", new XAttribute("name", Name), Packages.Select(x=> x.AsXElement(ignoreEmptyValues, languagesToWrite)).ToList()); - } + //public XElement AsXelement(bool ignoreEmptyValues, List languagesToWrite) + //{ + // return new XElement("Project", new XAttribute("name", Name), Packages.Select(x => x.AsXElement(ignoreEmptyValues, languagesToWrite)).ToList()); + //} + //internal XElement AsXElement(bool ignoreEmptyValues, List languagesToWrite) + //{ + // return new XElement("Package", new XAttribute("name", Name), Keys.Select(x => x.AsXElement(ignoreEmptyValues, languagesToWrite)).ToList()); + //} + //internal XElement AsXElement(bool ignoreEmptyValues, List languagesToWrite) + //{ + // var res= new XElement("Key", new XAttribute("ID", Id)); + + // AddIfNecessary(res,"English", English, ignoreEmptyValues, languagesToWrite); + // AddIfNecessary(res, "German", German, ignoreEmptyValues, languagesToWrite); + // AddIfNecessary(res, "Italian", Italian, ignoreEmptyValues, languagesToWrite); + // AddIfNecessary(res, "Spanish", Spanish, ignoreEmptyValues, languagesToWrite); + // AddIfNecessary(res, "Portuguese", Portuguese, ignoreEmptyValues, languagesToWrite); + // AddIfNecessary(res, "Polish", Polish, ignoreEmptyValues, languagesToWrite); + // AddIfNecessary(res, "Czech", Czech, ignoreEmptyValues, languagesToWrite); + // AddIfNecessary(res, "Hungarian", Hungarian, ignoreEmptyValues, languagesToWrite); + // AddIfNecessary(res, "Russian", Russian, ignoreEmptyValues, languagesToWrite); + // AddIfNecessary(res, "Turkish", Turkish, ignoreEmptyValues, languagesToWrite); + // AddIfNecessary(res, "Japanese", Japanese, ignoreEmptyValues, languagesToWrite); + // AddIfNecessary(res, "Chinesesimp", Chinesesimp, ignoreEmptyValues, languagesToWrite); + // AddIfNecessary(res, "Chinese", Chinese, ignoreEmptyValues, languagesToWrite); + // AddIfNecessary(res, "Korean", Korean, ignoreEmptyValues, languagesToWrite); + + // return res; + //} + + //private void AddIfNecessary(XElement parent,string nameOfKey , string valueOfKey, bool ignoreEmptyValues, List languagesToWrite) + //{ + // if (ignoreEmptyValues && string.IsNullOrEmpty(valueOfKey)) + // { + // return; + // } + + // if (!languagesToWrite.Contains(nameOfKey)) + // { + // return; + // } + + // parent.Add(new XElement(nameOfKey, valueOfKey)); + + + + //} } } diff --git a/tabler.Logic/Helper/StringtableHelper.cs b/tabler.Logic/Helper/StringtableHelper.cs index 93a2069..ba793a0 100644 --- a/tabler.Logic/Helper/StringtableHelper.cs +++ b/tabler.Logic/Helper/StringtableHelper.cs @@ -82,21 +82,21 @@ private static Stringtable ParseXmlFile(FileInfo fileInfo) using (var reader = XmlReader.Create(sr.BaseStream, XmlReaderSettings)) { stringtable.Project = (Project)ser.Deserialize(reader); - foreach (var package in stringtable.Project.Packages) - { - foreach (var item in package.Keys) - { - item.PackageName = package.Name; - } - foreach (var container in package.Containers) - { - foreach (var item in package.Keys) - { - item.PackageName = package.Name; - item.ContainerName = container.Name; - } - } - } + //foreach (var package in stringtable.Project.Packages) + //{ + // foreach (var item in package.Keys) + // { + // item.PackageName = package.Name; + // } + // foreach (var container in package.Containers) + // { + // foreach (var item in package.Keys) + // { + // item.PackageName = package.Name; + // item.ContainerName = container.Name; + // } + // } + //} } } } @@ -191,15 +191,13 @@ public static void SaveStringTableFile(FileInfo currentFileInfo, Stringtable cur { xmlSettings.IndentChars = "\t"; } - - XDocument srcTree = new XDocument( new XDeclaration("1.0","utf-8","true"),currentStringtable.Project.AsXelement(true, header.Where(x => x.IsSelected).Select(x=> x.Key).ToList())); - + var xmlSerializer = new XmlSerializer(typeof(Project)); using (var writer = XmlWriter.Create(currentFileInfo.FullName, xmlSettings)) { - //xmlSerializer.Serialize(writer, currentStringtable.Project, dummyNamespace); - srcTree.Save(writer); + xmlSerializer.Serialize(writer, currentStringtable.Project, dummyNamespace); + } File.AppendAllText(currentFileInfo.FullName, Environment.NewLine); @@ -208,25 +206,10 @@ public static void SaveStringTableFile(FileInfo currentFileInfo, Stringtable cur } - private class Conv : ISimpleValueConverter - { - public object ConvertFromString(string text, Type type) - { - throw new NotImplementedException(); - } - - public string ConvertToString(object value) - { - throw new NotImplementedException(); - } - } - public static void SaveStringTableFile(FileInfo currentFileInfo, Stringtable currentStringtable) { SaveStringTableFile(currentFileInfo, currentStringtable, null); - - } diff --git a/tabler.wpf/Container/Key_ExtendedWithChangeTracking.cs b/tabler.wpf/Container/Key_ExtendedWithChangeTracking.cs index b009a6d..6705236 100644 --- a/tabler.wpf/Container/Key_ExtendedWithChangeTracking.cs +++ b/tabler.wpf/Container/Key_ExtendedWithChangeTracking.cs @@ -3,10 +3,7 @@ using System.ComponentModel; using System.Linq; using System.Runtime.Serialization; -using System.Text; -using System.Threading.Tasks; using System.Xml.Linq; -using MS.Internal.Annotations; using tabler.Logic.Classes; using tabler.Logic.Extensions; @@ -18,27 +15,72 @@ public class Key_ExtendedWithChangeTracking { [DataMember] public Dictionary Languages { get; set; } = new Dictionary(); + [DataMember] public Dictionary SystemValues { get; set; } = new Dictionary(); + public bool HasChanged + { + get + { + return Languages.Values.Any(x => x.HasChanged) || SystemValues.Values.Any(x => x.HasChanged); + } + } + + public void ResetHasChanged() + { + foreach (var item in Languages.Values) + { + item.HasChanged = false; + } + foreach (var item in SystemValues.Values) + { + item.HasChanged = false; + } + } - private const string IsComplete_PropertyName = "IsComplete"; - private const string Id_PropertyName = "Id"; - private const string Original_PropertyName = "Original"; - private const string PackageName_PropertyName = "PackageName"; - private const string ContainerName_PropertyName = "ContainerName"; - + public bool IsComplete + { + get { return SystemValues[IsComplete_PropertyName].CurrentValue == "true" ? true : false; } + } + + public string PackageName + { + get { return SystemValues[PackageName_PropertyName].CurrentValue; } + } + + public string ProjectName + { + get { return SystemValues[Project_PropertyName].CurrentValue; } + } + + public string ContainerName + { + get { return SystemValues[ContainerName_PropertyName].CurrentValue; } + } + public string Id + { + get { return SystemValues[Id_PropertyName].CurrentValue; } + } + + public const string IsComplete_PropertyName = "IsComplete"; + public const string Id_PropertyName = "Id"; + public const string Original_PropertyName = "Original"; + public const string PackageName_PropertyName = "PackageName"; + public const string ContainerName_PropertyName = "ContainerName"; + public const string Project_PropertyName = "ProjectName"; public Key_ExtendedWithChangeTracking() { } - public Key_ExtendedWithChangeTracking(Key key) + public Key_ExtendedWithChangeTracking(Key key, string projectName, string packageName, string containerName) { - SystemValues.Add(nameof(key.Id),new ChangeTrackerString( key.Id)); + SystemValues.Add(nameof(key.Id), new ChangeTrackerString(key.Id)); SystemValues.Add(nameof(key.Original), new ChangeTrackerString(key.Original)); - SystemValues.Add(nameof(key.ContainerName), new ChangeTrackerString(key.ContainerName)); - SystemValues.Add(nameof(key.PackageName), new ChangeTrackerString(key.PackageName)); - SystemValues.Add(IsCompletePropertyName, new ChangeTrackerString("false")); + SystemValues.Add(Project_PropertyName, new ChangeTrackerString(projectName)); + SystemValues.Add(PackageName_PropertyName, new ChangeTrackerString(packageName)); + SystemValues.Add(ContainerName_PropertyName, new ChangeTrackerString(containerName)); + SystemValues.Add(IsComplete_PropertyName, new ChangeTrackerString("false")); Languages.Add(nameof(key.Chinese), new ChangeTrackerString(key.Chinese)); Languages.Add(nameof(key.Chinesesimp), new ChangeTrackerString(key.Chinesesimp)); @@ -57,18 +99,18 @@ public Key_ExtendedWithChangeTracking(Key key) Languages.Add(nameof(key.Turkish), new ChangeTrackerString(key.Turkish)); } - public void Update_IsCompleted(List languagesToHave) + public void Update_IsCompletedValue(List languagesToHave) { foreach (var language in languagesToHave) { if (string.IsNullOrEmpty(Languages[language].CurrentValue)) { - SystemValues[IsCompletePropertyName].CurrentValue = "false"; + SystemValues[IsComplete_PropertyName].CurrentValue = "false"; return; }; } - SystemValues[IsCompletePropertyName].CurrentValue = "true"; + SystemValues[IsComplete_PropertyName].CurrentValue = "true"; } public bool ContainsText(string value, bool searchOnlyInId, bool ignoreCase) @@ -97,7 +139,7 @@ public bool ContainsText(string value, bool searchOnlyInId, bool ignoreCase) return true; } } - + return false; } diff --git a/tabler.wpf/Controls/TranslationFileSingleControl.xaml b/tabler.wpf/Controls/TranslationFileSingleControl.xaml index 07c738f..2601291 100644 --- a/tabler.wpf/Controls/TranslationFileSingleControl.xaml +++ b/tabler.wpf/Controls/TranslationFileSingleControl.xaml @@ -85,18 +85,30 @@ --> + + + - + - + diff --git a/tabler.wpf/Controls/TranslationFileSingleControl.xaml.cs b/tabler.wpf/Controls/TranslationFileSingleControl.xaml.cs index a98ffdd..65ca129 100644 --- a/tabler.wpf/Controls/TranslationFileSingleControl.xaml.cs +++ b/tabler.wpf/Controls/TranslationFileSingleControl.xaml.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Collections.ObjectModel; +using System.Globalization; using System.IO; using System.Linq; using System.Text; @@ -14,9 +15,13 @@ using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; +using System.Xml; +using System.Xml.Linq; +using System.Xml.Serialization; using tabler.Logic.Classes; using tabler.Logic.Enums; using tabler.Logic.Helper; +using tabler.wpf.Container; using tabler.wpf.Helper; using Key = tabler.Logic.Classes.Key; @@ -28,8 +33,31 @@ namespace tabler.wpf.Controls public partial class TranslationFileSingleControl : UserControl { private CollectionViewSource _collViewSource = new CollectionViewSource(); - private class KeyCollection : ObservableCollection - {} + private class KeyCollection : ObservableCollection + { } + + private class Key_ExtendedWithChangeTrackingValueConverter : IValueConverter + { + private string _propertyName; + public Key_ExtendedWithChangeTrackingValueConverter(string systemValuesPropertyName) + { + _propertyName = systemValuesPropertyName; + } + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + if (value is Key_ExtendedWithChangeTracking key) + { + return ((Key_ExtendedWithChangeTracking)value).SystemValues[_propertyName].CurrentValue; + } + return value; + + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } + } private KeyCollection _keyCollection = new KeyCollection(); public bool AlreadyLoaded { get; set; } = false; @@ -38,9 +66,9 @@ private class KeyCollection : ObservableCollection public List Header { get; set; } private bool _filteringDiabled = false; - private PropertyGroupDescription _groupDescriptionPackageName = new PropertyGroupDescription("PackageName"); - private PropertyGroupDescription _groupDescriptionIsComplete = new PropertyGroupDescription("IsCompleteName"); - + private PropertyGroupDescription _groupDescriptionPackageName = new PropertyGroupDescription(null, new Key_ExtendedWithChangeTrackingValueConverter(Key_ExtendedWithChangeTracking.PackageName_PropertyName)); + private PropertyGroupDescription _groupDescriptionIsComplete = new PropertyGroupDescription(null, new Key_ExtendedWithChangeTrackingValueConverter(Key_ExtendedWithChangeTracking.IsComplete_PropertyName)); + #region CTOR and Load data public TranslationFileSingleControl(FileInfo file) : this() { @@ -53,7 +81,7 @@ public TranslationFileSingleControl() _collViewSource.Source = _keyCollection; _collViewSource.Filter += _collViewSource_Filter; - + if (_collViewSource.View.CanGroup == true) { _collViewSource.View.GroupDescriptions.Clear(); @@ -62,6 +90,7 @@ public TranslationFileSingleControl() } dge_Main.ItemsSource = _collViewSource.View; + //dge_Main.ItemsSource = _keyCollection; var menu = new MenuItem { Header = "Copy complete row(s)" }; menu.Click += copyCompleteRow; @@ -93,13 +122,22 @@ public void Load() dge_Main.Columns.Clear(); StringTable = StringtableHelper.ParseStringtable(CurrentFile); - + SetHeader(); UpdateIsCompleteFlag(); - - foreach (var item in StringTable.Project.Packages.SelectMany(x => x.Keys).ToList()) + foreach (var package in StringTable.Project.Packages) { - _keyCollection.Add(item); + foreach (var key in package.Keys) + { + _keyCollection.Add(new Key_ExtendedWithChangeTracking(key, StringTable.Project.Name, package.Name, string.Empty)); + } + foreach (var container in package.Containers) + { + foreach (var key in package.Keys) + { + _keyCollection.Add(new Key_ExtendedWithChangeTracking(key, StringTable.Project.Name, package.Name, container.Name)); + } + } } } catch (Exception ex) @@ -115,9 +153,9 @@ public void Load() private void _collViewSource_Filter(object sender, FilterEventArgs e) { - Key t = e.Item as Key; + var t = e.Item as Key_ExtendedWithChangeTracking; - if (t != null) + if (t != null) { if (string.IsNullOrEmpty(this.tbe_FilterAndSearchAll.Value) && string.IsNullOrEmpty(this.tbe_FilterAndSearchInId.Value)) { @@ -147,11 +185,11 @@ private void _collViewSource_Filter(object sender, FilterEventArgs e) e.Accepted = false; } } - + } } } - + private void tbe_FilterAndSearchInId_changed(int value) { if (_filteringDiabled) @@ -212,7 +250,7 @@ private void cbGroupByStatus_click(object sender, RoutedEventArgs e) return; } - this._collViewSource.View.GroupDescriptions.Add( _groupDescriptionIsComplete); + this._collViewSource.View.GroupDescriptions.Add(_groupDescriptionIsComplete); } else { @@ -230,18 +268,18 @@ private void cbGroupByStatus_click(object sender, RoutedEventArgs e) #region ContextMenu actions private void pasteCompleteRowBelowCurrentRow(object sender, RoutedEventArgs e) { - var keys = ClipBoardHelper.GetKeyObjectsFromClipboard(); - if (keys != null && keys.Any()) - { - StringTable.Project.Packages.FirstOrDefault().Keys.AddRange(keys); - } + //var keys = ClipBoardHelper.GetKeyObjectsFromClipboard(); + //if (keys != null && keys.Any()) + //{ + // StringTable.Project.Packages.FirstOrDefault().Keys.AddRange(keys); + //} } private void copyCompleteRow(object sender, RoutedEventArgs e) { var b = _collViewSource.IsLiveGrouping; - var keys = this.dge_Main.SelectedCells.Select(x => x.Item).OfType().Distinct().ToList(); + var keys = this.dge_Main.SelectedCells.Select(x => x.Item).OfType().Distinct().ToList(); if (keys != null && keys.Any()) { ClipBoardHelper.AddKeyObjectsToClipboard(keys); @@ -261,7 +299,8 @@ private void btnSave_click(object sender, RoutedEventArgs e) try { StringTable.HasChanges = true; - StringtableHelper.SaveStringTableFile(CurrentFile, StringTable, Header); + SaveStringTableFile(CurrentFile, StringTable.FileHasBom,this._keyCollection.ToList(), Header); + } catch (Exception ex) { @@ -269,6 +308,90 @@ private void btnSave_click(object sender, RoutedEventArgs e) } } + private void SaveStringTableFile( + FileInfo currentFileInfo, + bool fileHasBom, + List currentKeys, + List header) + { + if (currentKeys == null) + { + return; + } + + if (!currentKeys.Any(x => x.HasChanged)) + { + return; + } + + var dummyNamespace = new XmlSerializerNamespaces(); + dummyNamespace.Add("", ""); + + var xmlSettings = new XmlWriterSettings + { + Indent = true, + IndentChars = " ", + Encoding = new UTF8Encoding(fileHasBom) + }; + + if (ConfigHelper.CurrentSettings.IndentationSettings == IndentationSettings.Spaces) + { + var indentChars = ""; + + for (var i = 0; i < ConfigHelper.CurrentSettings.TabSize; i++) + { + indentChars += " "; + } + + xmlSettings.IndentChars = indentChars; + } + + if (ConfigHelper.CurrentSettings.IndentationSettings == IndentationSettings.Tabs) + { + xmlSettings.IndentChars = "\t"; + } + + var projectGroups = _keyCollection.GroupBy(x => x.SystemValues[Key_ExtendedWithChangeTracking.Project_PropertyName].CurrentValue).ToList(); + + var languagesToWrite = header.Where(x => x.IsSelected).Select(x => x.Key).Distinct().ToList(); + + XDocument srcTree = new XDocument(new XDeclaration("1.0", "utf-8", "true")); + + foreach (var projectItems in projectGroups) + { + var project = new XElement("Project", new XAttribute("name", projectItems.Key)); + srcTree.Add(project); + var packages = projectItems.GroupBy(x => x.PackageName).ToList(); + + foreach (var package in packages) + { + XElement toAddTo = project; + if (!string.IsNullOrEmpty(package.Key)) + { + //we have packages + toAddTo = new XElement("Package", new XAttribute("name", package.Key)); + project.Add(toAddTo); + } + + foreach (var itemInPackage in package) + { + toAddTo.Add(itemInPackage.AsXElement(true,languagesToWrite)); + } + } + } + + using (var writer = XmlWriter.Create(currentFileInfo.FullName, xmlSettings)) + { + srcTree.Save(writer); + } + + foreach (var item in _keyCollection) + { + item.ResetHasChanged(); + } + } + + private void btnReloadFile_click(object sender, RoutedEventArgs e) { AlreadyLoaded = false; @@ -299,7 +422,7 @@ private void btnSelectLanguages_click(object sender, RoutedEventArgs e) #region private methods - private void SetHeader() + private void SetHeader() { var initHeader = TranslationHelper.GetHeaders(StringTable); @@ -307,28 +430,34 @@ private void SetHeader() foreach (var languageName in Enum.GetNames(typeof(Languages))) { - allItems.Add(new ItemSelected() { DisplayName = languageName, IsSelected = initHeader.Any(x => x == languageName), Key = languageName }); + allItems.Add(new ItemSelected() { + DisplayName = languageName, + IsSelected = initHeader.Any(x => x == languageName), + Key = languageName }); } Header = allItems; - AddColumns(new ItemSelected() { IsSelected = true, DisplayName = "IsComplete", Key = "IsComplete" }); - AddColumns(new ItemSelected() { IsSelected = true, DisplayName = "Id", Key = "Id" }); - AddColumns(new ItemSelected() { IsSelected = true, DisplayName = "Project", Key = "Project" }); + //AddColumns(new ItemSelected() { IsSelected = true, DisplayName = Key_ExtendedWithChangeTracking.IsComplete_PropertyName, Key = Key_ExtendedWithChangeTracking.IsComplete_PropertyName }); + AddColumns(new ItemSelected() { + IsSelected = true, + DisplayName = Key_ExtendedWithChangeTracking.Id_PropertyName, + Key = Key_ExtendedWithChangeTracking.Id_PropertyName }, "SystemValues"); + //AddColumns(new ItemSelected() { IsSelected = true, DisplayName = Key_ExtendedWithChangeTracking.Project_PropertyName, Key = Key_ExtendedWithChangeTracking.Project_PropertyName }); foreach (var header in allItems) { - AddColumns(header); + AddColumns(header, "Languages"); } } - private void AddColumns(ItemSelected header) + private void AddColumns(ItemSelected header, string dictionaryInKey_ExtendedWithChangeTracking) { var binding = new Binding(header.Key); binding.Mode = BindingMode.TwoWay; var dgNew = new DataGridTextColumn { // bind to a dictionary property - Binding = binding,//new Binding("Custom[" + name + "]"), + Binding = new Binding(dictionaryInKey_ExtendedWithChangeTracking+"[" + header.Key + "].CurrentValue"), Header = header.DisplayName, Width = 100, Visibility = header.IsSelected ? Visibility.Visible : Visibility.Collapsed, @@ -342,18 +471,12 @@ private void AddColumns(ItemSelected header) private void UpdateIsCompleteFlag() { - //foreach (var item in _keyCollection) - //{ - // item.UpdateIsComplete(Header.Where(x=> x.IsSelected).Select(x=> x.Key).ToList()); - //} - var selectedHeader = Header.Where(x => x.IsSelected).Select(x => x.Key).ToList(); - foreach (var item in StringTable.Project.Packages.SelectMany(x => x.Keys)) + foreach (var item in _keyCollection) { - item.UpdateIsComplete(selectedHeader); + item.Update_IsCompletedValue(selectedHeader); } - } private void SynchVisibleHeader() diff --git a/tabler.wpf/ExampleData/TEST.xml b/tabler.wpf/ExampleData/TEST.xml new file mode 100644 index 0000000..7c31d42 --- /dev/null +++ b/tabler.wpf/ExampleData/TEST.xml @@ -0,0 +1,225 @@ + + + + + TEST + Windinformationen anzeigen + Afficher les info sur le vent + Mostra indicazioni del vento + Mostrar información del viento + Mostrar Informação do Vento + Pokaż inf. o wietrze + Zobrazit informace o větru + Széladatok mutatása + Показать информацию о ветре + + + Show Protractor + Winkelmesser anzeigen + Afficher le rapporteur + Mostra il rapportatore + Mostrar transportador + Mostrar Transferidor + Pokaż kątomierz + Zobrazit úhloměr + Szögmérő mutatása + Показать транспортир + + + Advanced Ballistics + Erweiterte Ballistik + Balística avanzada + Balística avançada + Zaawansowana balistyka + Pokročilá balistika + + + Advanced Ballistics + Erweiterte Ballistik + Balística avanzada + Balística avançada + Zaawansowana balistyka + Pokročilá balistika + + + Enables advanced ballistics + Aktiviert die erweiterte Ballistik + Activa la balística avanzada + Ativa balística avançada + Aktywuje zaawansowaną balistykę + Aktivuje pokročilou balistiku + + + Enabled For Snipers + Für Scharfschützen aktiviert + dth + Activada para francotiradores + Ativar para caçadores + Akt. dla snajperów + Povoleno pro odstřelovače + + + Enables advanced ballistics for non local snipers (when using high power optics) + Aktiviert die erweiterte Ballistik für nicht lokale Scharfschützen (bei Benutzung von Optiken mit starker Vergrößerung) + thf + Activa la balística avanzada para francotiradores no locales (cuando se usa una mira telescópica) + Ativa balística avançada para caçadores não locais (quando usando miras telescópicas) + Aktywuje zaawansowaną balistykę dla nielokalnych snajperów (kiedy używają optyki) + Aktivuje pokročilou balistiku pro nelokální odstřelovače (když používá výkonnou optiku) + + + Enabled For Group Members + Für Gruppenmitglieder aktiviert + dht + Activada para miembros de grupo + Ativada para membros do grupo + Akt. dla czł. grupy + Povoleno pro členy skupiny + + + Enables advanced ballistics for non local group members + Aktiviert die erweiterte Ballistik für nicht lokale Gruppenmitglieder + Activada la balística avanzada para miembros de grupo no locales + Ativa balística avançada para membros de grupo não locais + Aktywuje zaawansowaną balistykę dla nielokalnych członków grupy + Aktivuje pokročilou balistiku pro nelokální členy skupiny + + + Enabled For Everyone + Für jeden aktiviert + t + Activada para todos + Ativada para todos + Akt. dla wszystkich + Povoleno pro všechny + + + Enables advanced ballistics for all non local players (enabling this may degrade performance during heavy firefights in multiplayer) + Aktiviert die erweiterte Ballistik für alle nicht lokalen Spieler (das Aktivieren dieser Funktion kann zur Beeinträchtigung des Spielerlebnisses im Multiplayer führen) + hhf + Activada la balística avanzada para todos los jugadores no locales (activarlo puede degradar el rendimiento durante grandes tiroteos en multijugador). + Ativa balística avançada para todos os jogadores não locais (ativando isso pode degradar a performance durante troca de tiros intensas no multiplayer) + Aktywuje zaawansowaną balistykę dla wszystkich nielokalnych graczy (aktywacja tej opcji może spodowować spory spadek wydajności podczas ciężkiej wymiany ognia) + Aktivovat pokročilou balistiku pro všechny nelokální hráče (aktivace této možnosti způsobuje pokles snímu za sekundu během těžké přestřelky v multiplayeru) + + + Always Enabled For Group Members + Für Gruppenmitglieder immer aktiviert + Siempre activada para miembros de grupo + Sempre ativada para membros do grupo + Zawsze akt. dla czł. grupy + Vždy povoleno pro členy skupiny + + + Always enables advanced ballistics when a group member fires + Aktiviert die erweiterte Ballistik immer, wenn ein Gruppenmitglied schießt + h + Activada la balística avanzada siempre cuando miembros de grupo disparan + Sempre ative balística avançada quando um membro do grupo disparar + Aktywuje zaawansowaną balistykę dla wszystkich członków grupy + Aktivuje pokročilou balistiku pro členy skupiny + + + Disabled In FullAuto Mode + Beim vollautomatischen Feuern deaktiviert + htah + Desactivada en modo automático + Desabilitar no modo automático + Wył. podczas ognia auto. + Zakázáno v automatickém režimu střelby + + + Disables the advanced ballistics during full auto fire + Deaktiviert die erweiterte Ballistik beim vollautomatischen Feuern + Desactivada la balística avanzada durante el fuego automático + Desabilitar a balística avançada durante fogo automático + Dezaktywuje zaawansowaną balistykę podczas ognia automatycznego + Zákáže pokročilou balistiku během střelby v režimu automat + + + Enable Ammo Temperature Simulation + Simulation der Munitionstemperatur aktivieren + Activar simulación de temperatura de munición + Ativar simulação de temperatura de munição + Symulacja temp. amunicji + Povolit simulaci teploty munice + + + Muzzle velocity varies with ammo temperature + Munitionstemperatur hat Einfluss auf die Mündungsgeschwindigkeit + La velocidad de salida varía con la temperatura de la munición + A velocidade de saída varia com a temperatura da munição + Prędkość wylotowa pocisku jest zależna od temperatury amunicji + Úsťová rychlost je závislá na teplotě munice + + + Enable Barrel Length Simulation + Simulation der Lauflänge aktivieren + Habilitar la simulación de longitud del cañón + Ativar a simulação de comprimento do cano + Symulacja długości lufy + Povolit simulaci délky hlavně + + + Muzzle velocity varies with barrel length + Lauflänge beeinflusst Mündungsgeschwindigkeit + La velocidad de salidal varía con la longitud del cañón + A velocidade de saída caria com o comprimento do cano + Prędkość wylotowa pocisku jest zależna od długości lufy + Úsťová rychlost je závislá na délce hlavně + + + Enable Bullet Trace Effect + Geschossspureffekt aktivieren + Activar el efecto trazador de la bala + Ativa efeito traçante de projétil + Efekt smugi pocisku + Povolit efekt trasírek + + + Enables a bullet trace effect to high caliber bullets (only visible when looking through high power optics) + Aktiviere Geschossspureffekt für hohe Kaliber (bei Benutzung von Optiken mit starker Vergrößerung) + Activa el efecto trazador de la balas de gran calibre (solo visible cuando se mira a través de una mira telescópica) + Ativa o efeito traçante de projétil para projéteis de alto calibre (somente visível quando observado por miras telescópicas) + Aktywuje efekt smugi pocisku dla pocisków wysokokalibrowych (widoczne tylko podczas patrzenia przez optykę) + Aktivuje efekt trasírek z vysokokaliberních zbraní (viditelné pouze skrze výkonnou optiku) + + + Simulation Interval + Simulationsintervall + Intervalo de simulación + Intervalo da simulação + Interwał symulacji + Interval simulace + + + Defines the interval between every calculation step + Legt das Intervall zwischen den Berechnungsschritten fest + Define el intervalo entre cada cálculo + Define o intervalo entre cada cálculo + Określa interwał pomiędzy każdym krokiem kalkulacji + Určuje interval mezi každým výpočtem + + + Simulation Radius + Simulationsradius + Radio de simulación + Raio de simulação + Zasięg symulacji + Rozsah simulace + + + Defines the radius around the player (in meters) at which advanced ballistics are applied to projectiles + Gibt den Radius (in Metern) um den Spieler an, bei dem die erweiterte Ballistik auf Geschosse angewendet wird + Define el radio alrededor del jugador (en metros) en el cual se aplica la balística avanzada a los proyectiles + Define o raio ao redor do jogador (em metros) onde a balística avançada será aplicada aos projéteis + Określa obszar naokoło gracza (w metrach), na którym zaawansowana balistyka jest aplikowana dla pocisków + Určuje oblast kolem hráče (v metrech), kde je pokročilá balistika použita na projektil + + + Este módulo permite que você ative cálculos de balística avançada, fazendo a trajetória do projétil levar em consideração coisas como temperatura do ar, pressão atmosférica, umidade, força de Coriolis, a gravidade, o modelo da arma no qual o disparo é realizado e o tipo de munição. Tudo isso acrescenta-se a um balística muito precisa. + Moduł ten pozwala aktywować zaawansowaną balistykę biorącą przy obliczeniach trajektorii lotu pocisku pod uwagę takie rzeczy jak temperatura powietrza, ciśnienie atmosferyczne, wilgotność powietrza, siły Coriolisa i Eotvosa, grawitację a także broń z jakiej wykonywany jest strzał oraz rodzaj amunicji. Wszystko to sprowadza się na bardzo dokładne odwzorowanie balistyki. + Tento modul umožňuje aktivovat pokročilou balistiku, která vypočítává trajektorii kulky a bere do úvahy věci jako je teplota vzduchu, atmosférický tlak, vlhkost vzduchu, gravitaci, typ munice a zbraň, ze které je náboj vystřelen. To vše přispívá k velmi přesné balistice. + + + \ No newline at end of file diff --git a/tabler.wpf/ExampleData/TEST.xmlFILE b/tabler.wpf/ExampleData/TEST.xmlFILE new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/tabler.wpf/ExampleData/TEST.xmlFILE @@ -0,0 +1 @@ + diff --git a/tabler.wpf/Helper/ClipBoardHelper.cs b/tabler.wpf/Helper/ClipBoardHelper.cs index 6c4aa84..34c5580 100644 --- a/tabler.wpf/Helper/ClipBoardHelper.cs +++ b/tabler.wpf/Helper/ClipBoardHelper.cs @@ -8,6 +8,7 @@ using System.Windows.Threading; using tabler.Logic.Classes; using tabler.Logic.Helper; +using tabler.wpf.Container; namespace tabler.wpf.Helper { @@ -15,10 +16,10 @@ public static class ClipBoardHelper { private static DataFormat GetDataFormatOfKey() { - return DataFormats.GetDataFormat(typeof(List).FullName); + return DataFormats.GetDataFormat(typeof(List).FullName); } - public static void AddKeyObjectsToClipboard(List obj) + public static void AddKeyObjectsToClipboard(List obj) { if (Thread.CurrentThread.GetApartmentState() != ApartmentState.STA) { @@ -40,19 +41,19 @@ public static void AddKeyObjectsToClipboard(List obj) } } - public static void AddKeyObjectToClipboard(Key obj) + public static void AddKeyObjectToClipboard(Key_ExtendedWithChangeTracking obj) { - AddKeyObjectsToClipboard(new List { obj }); + AddKeyObjectsToClipboard(new List { obj }); } - public static List GetKeyObjectsFromClipboard() + public static List GetKeyObjectsFromClipboard() { if (Thread.CurrentThread.GetApartmentState() != ApartmentState.STA) { Logger.LogInternal($"To access the clipboard, the thread must be STA!"); return null; } - List doc = null; + List doc = null; try { @@ -62,7 +63,7 @@ public static List GetKeyObjectsFromClipboard() if (dataObj != null && dataObj.GetDataPresent(format.Name)) { var o = dataObj.GetData(format.Name); - doc = o as List; + doc = o as List; Logger.LogGeneral($"Get key from clipboard SUCCESSS "); } else @@ -80,7 +81,7 @@ public static List GetKeyObjectsFromClipboard() } - public static Key GetKeyObjectFromClipboard() + public static Key_ExtendedWithChangeTracking GetKeyObjectFromClipboard() { return GetKeyObjectsFromClipboard().FirstOrDefault(); diff --git a/tabler.wpf/Helper/Converter/ValueToBrushConverter.cs b/tabler.wpf/Helper/Converter/ValueToBrushConverter.cs index 762876f..6a8da2f 100644 --- a/tabler.wpf/Helper/Converter/ValueToBrushConverter.cs +++ b/tabler.wpf/Helper/Converter/ValueToBrushConverter.cs @@ -10,6 +10,7 @@ using System.Windows.Markup; using System.Windows.Media; using tabler.Logic.Helper; +using tabler.wpf.Container; namespace tabler.wpf.Helper.Converter { @@ -17,39 +18,33 @@ public class ValueToBrushConverter : MarkupExtension, IValueConverter { public static readonly IValueConverter Instance = new ValueToBrushConverter(); + private readonly static SolidColorBrush _textMissing = new SolidColorBrush(Colors.Orange); + private readonly static SolidColorBrush _textOk = new SolidColorBrush(Colors.LightGreen); + private readonly static SolidColorBrush _textChanged = new SolidColorBrush(Colors.LightYellow); public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { try { var cell = value as DataGridCell; - if (cell == null) - { - //return DependencyProperty.UnsetValue; - return new SolidColorBrush(Colors.Orange); - } - if (cell.Content == null) + var item = cell.DataContext as Key_ExtendedWithChangeTracking; + if (item != null ) { - // return DependencyProperty.UnsetValue; - return new SolidColorBrush(Colors.Beige); + ChangeTrackerString valueString; + if (item.Languages.TryGetValue((string)cell.Column.Header, out valueString)) + { + if (string.IsNullOrEmpty(valueString.CurrentValue)) + { + return _textMissing; + } + if (valueString.HasChanged) + { + return _textChanged; + } + return _textOk; + } } - - var tb = cell.Content as TextBlock; - if (tb == null) - { - return DependencyProperty.UnsetValue; - //return new SolidColorBrush(Colors.Beige); - } - - if (!string.IsNullOrEmpty(tb.Text)) - { - return new SolidColorBrush(Colors.Green); - //return DependencyProperty.UnsetValue; - } - return new SolidColorBrush(Colors.YellowGreen); - // return DependencyProperty.UnsetValue; - } catch (Exception ex) { diff --git a/tabler.wpf/tabler.wpf.csproj b/tabler.wpf/tabler.wpf.csproj index f2d2d2f..1964b5d 100644 --- a/tabler.wpf/tabler.wpf.csproj +++ b/tabler.wpf/tabler.wpf.csproj @@ -65,6 +65,7 @@ 4.0 + From c735bd542681c2814ee48ea044c8a1c9c8caf72b Mon Sep 17 00:00:00 2001 From: MaMilaCan Date: Wed, 4 Dec 2019 19:49:49 +0100 Subject: [PATCH 3/3] ListView added Even More features --- tabler.Logic/Helper/IProgress.cs | 35 +++ tabler.Logic/Helper/StringtableHelper.cs | 94 ++++---- tabler.Logic/tabler.Logic.csproj | 1 + .../Key_ExtendedWithChangeTracking.cs | 16 +- ...aml => DirectoryFilesOverviewControl.xaml} | 23 +- .../DirectoryFilesOverviewControl.xaml.cs | 66 ++++++ .../Controls/Helper_ProgressBar.xaml.cs | 24 ++- tabler.wpf/Controls/ItemSelectControl.xaml | 1 - tabler.wpf/Controls/ListViewWrapperClass.xaml | 21 ++ .../Controls/ListViewWrapperClass.xaml.cs | 57 +++++ .../TranslationFileOverviewControl.xaml.cs | 69 ------ .../TranslationFileSingleControl.xaml | 41 ++-- .../TranslationFileSingleControl.xaml.cs | 204 ++++++++++++++---- tabler.wpf/Windows/MainWindow.xaml | 4 +- tabler.wpf/Windows/MainWindow.xaml.cs | 45 ++-- tabler.wpf/tabler.wpf.csproj | 13 +- 16 files changed, 469 insertions(+), 245 deletions(-) create mode 100644 tabler.Logic/Helper/IProgress.cs rename tabler.wpf/Controls/{TranslationFileOverviewControl.xaml => DirectoryFilesOverviewControl.xaml} (55%) create mode 100644 tabler.wpf/Controls/DirectoryFilesOverviewControl.xaml.cs create mode 100644 tabler.wpf/Controls/ListViewWrapperClass.xaml create mode 100644 tabler.wpf/Controls/ListViewWrapperClass.xaml.cs delete mode 100644 tabler.wpf/Controls/TranslationFileOverviewControl.xaml.cs diff --git a/tabler.Logic/Helper/IProgress.cs b/tabler.Logic/Helper/IProgress.cs new file mode 100644 index 0000000..1512006 --- /dev/null +++ b/tabler.Logic/Helper/IProgress.cs @@ -0,0 +1,35 @@ +namespace tabler.Logic.Helper +{ + public delegate void CurrentProgressChanged(int progress, string currentAction); + public interface IProgress + { + int CurrentProgressValue { get; set; } + event CurrentProgressChanged ProgressChangedEvent; + string CurrentAction { get; set; } + } + + public class ProgressHelper : IProgress + { + public int CurrentProgressValue { get; set; } + public string CurrentAction { get; set; } + + public event CurrentProgressChanged ProgressChangedEvent; + + public void FireProgressChangedEvent(int progress, string currentAction) + { + CurrentProgressValue = progress; + CurrentAction = currentAction; + ProgressChangedEvent?.Invoke(progress, currentAction); + } + public void FireProgressNameChangedEvent(string currentAction) + { + FireProgressChangedEvent(CurrentProgressValue, currentAction); + } + public void FireProgressChangedEvent(int progress) + { + FireProgressChangedEvent(progress, CurrentAction); + } + + } + +} diff --git a/tabler.Logic/Helper/StringtableHelper.cs b/tabler.Logic/Helper/StringtableHelper.cs index ba793a0..603af7f 100644 --- a/tabler.Logic/Helper/StringtableHelper.cs +++ b/tabler.Logic/Helper/StringtableHelper.cs @@ -1,5 +1,3 @@ -using Polenter.Serialization; -using Polenter.Serialization.Advanced.Xml; using System; using System.Collections.Generic; using System.IO; @@ -7,13 +5,14 @@ using System.Text; using System.Threading.Tasks; using System.Xml; -using System.Xml.Linq; using System.Xml.Serialization; using tabler.Logic.Classes; using tabler.Logic.Exceptions; namespace tabler.Logic.Helper { + + public static class StringtableHelper { private static XmlReaderSettings _xmlReaderSettings; @@ -45,25 +44,27 @@ public static IEnumerable ParseStringtables(IEnumerable a var stringtables = new System.Collections.Concurrent.ConcurrentBag(); Parallel.ForEach(allStringtableFiles, currentFile => { - stringtables.Add(ParseStringtable(currentFile)); + stringtables.Add(ParseStringtable(currentFile).Result); }); return stringtables.ToList(); } - public static Stringtable ParseStringtable(FileInfo stringtableFile) - { - var stringtable = ParseXmlFile(stringtableFile); + public static async Task ParseStringtable(FileInfo stringtableFile) + { + var stringtable = await ParseXmlFile(stringtableFile); ValidateStringtable(stringtable); return stringtable; } + + /// /// /// /// /// - private static Stringtable ParseXmlFile(FileInfo fileInfo) + private static async Task ParseXmlFile(FileInfo fileInfo) { var stringtable = new Stringtable { @@ -71,52 +72,45 @@ private static Stringtable ParseXmlFile(FileInfo fileInfo) Name = fileInfo.Directory.Name }; - try - { - var ser = new XmlSerializer(typeof(Project)); - - using (var sr = new StreamReader(fileInfo.FullName)) + var res = await new TaskFactory().StartNew( + () => { - stringtable.FileHasBom = FileHelper.FileHasBom(sr.BaseStream); - using (var reader = XmlReader.Create(sr.BaseStream, XmlReaderSettings)) + try { - stringtable.Project = (Project)ser.Deserialize(reader); - //foreach (var package in stringtable.Project.Packages) - //{ - // foreach (var item in package.Keys) - // { - // item.PackageName = package.Name; - // } - // foreach (var container in package.Containers) - // { - // foreach (var item in package.Keys) - // { - // item.PackageName = package.Name; - // item.ContainerName = container.Name; - // } - // } - //} + var ser = new XmlSerializer(typeof(Project)); + + using (var sr = new StreamReader(fileInfo.FullName)) + { + stringtable.FileHasBom = FileHelper.FileHasBom(sr.BaseStream); + + using (var reader = XmlReader.Create(sr.BaseStream, XmlReaderSettings)) + { + stringtable.Project = (Project)ser.Deserialize(reader); + } + } + } + catch (XmlException ex) + { + throw new GenericXmlException("", fileInfo.FullName, ex.Message); + } + catch (InvalidOperationException ex) + { + var message = new StringBuilder(); + message.Append(ex.Message); + if (ex.InnerException != null) + { + message.AppendLine().Append(ex.InnerException.Message); + } + + throw new MalformedStringtableException(fileInfo.FullName, message.ToString()); } - } - } - catch (XmlException ex) - { - throw new GenericXmlException("", fileInfo.FullName, ex.Message); - } - catch (InvalidOperationException ex) - { - var message = new StringBuilder(); - message.Append(ex.Message); - if (ex.InnerException != null) - { - message.AppendLine().Append(ex.InnerException.Message); - } - throw new MalformedStringtableException(fileInfo.FullName, message.ToString()); - } + return stringtable; - return stringtable; + }); + + return res; } @@ -191,13 +185,13 @@ public static void SaveStringTableFile(FileInfo currentFileInfo, Stringtable cur { xmlSettings.IndentChars = "\t"; } - + var xmlSerializer = new XmlSerializer(typeof(Project)); using (var writer = XmlWriter.Create(currentFileInfo.FullName, xmlSettings)) { xmlSerializer.Serialize(writer, currentStringtable.Project, dummyNamespace); - + } File.AppendAllText(currentFileInfo.FullName, Environment.NewLine); diff --git a/tabler.Logic/tabler.Logic.csproj b/tabler.Logic/tabler.Logic.csproj index 51c5a74..061b61a 100644 --- a/tabler.Logic/tabler.Logic.csproj +++ b/tabler.Logic/tabler.Logic.csproj @@ -64,6 +64,7 @@ + diff --git a/tabler.wpf/Container/Key_ExtendedWithChangeTracking.cs b/tabler.wpf/Container/Key_ExtendedWithChangeTracking.cs index 6705236..5757477 100644 --- a/tabler.wpf/Container/Key_ExtendedWithChangeTracking.cs +++ b/tabler.wpf/Container/Key_ExtendedWithChangeTracking.cs @@ -40,7 +40,7 @@ public void ResetHasChanged() public bool IsComplete { - get { return SystemValues[IsComplete_PropertyName].CurrentValue == "true" ? true : false; } + get { return SystemValues[IsComplete_PropertyName].CurrentValue == "Complete" ? true : false; } } public string PackageName @@ -105,12 +105,12 @@ public void Update_IsCompletedValue(List languagesToHave) { if (string.IsNullOrEmpty(Languages[language].CurrentValue)) { - SystemValues[IsComplete_PropertyName].CurrentValue = "false"; + SystemValues[IsComplete_PropertyName].CurrentValue = "Incomplete"; return; }; } - SystemValues[IsComplete_PropertyName].CurrentValue = "true"; + SystemValues[IsComplete_PropertyName].CurrentValue = "Complete"; } public bool ContainsText(string value, bool searchOnlyInId, bool ignoreCase) @@ -171,6 +171,10 @@ private void AddIfNecessary(XElement parent, string nameOfKey, string valueOfKey public class ChangeTrackerString : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; + private void RaisePropertyChanged(string propName) + { + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propName)); + } public string OriginalValue { get; set; } private string _currentValue; @@ -182,11 +186,7 @@ public ChangeTrackerString(string originalValue) _currentValue = OriginalValue; } - private void RaisePropertyChanged(string propName) - { - PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propName)); - } - + public bool HasChanged { get => _hasChanged; set => _hasChanged = value; } diff --git a/tabler.wpf/Controls/TranslationFileOverviewControl.xaml b/tabler.wpf/Controls/DirectoryFilesOverviewControl.xaml similarity index 55% rename from tabler.wpf/Controls/TranslationFileOverviewControl.xaml rename to tabler.wpf/Controls/DirectoryFilesOverviewControl.xaml index a33ead9..155f1b5 100644 --- a/tabler.wpf/Controls/TranslationFileOverviewControl.xaml +++ b/tabler.wpf/Controls/DirectoryFilesOverviewControl.xaml @@ -1,4 +1,4 @@ - + - + - - - - - - - - - - - + + + + diff --git a/tabler.wpf/Controls/DirectoryFilesOverviewControl.xaml.cs b/tabler.wpf/Controls/DirectoryFilesOverviewControl.xaml.cs new file mode 100644 index 0000000..7533dc3 --- /dev/null +++ b/tabler.wpf/Controls/DirectoryFilesOverviewControl.xaml.cs @@ -0,0 +1,66 @@ +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Windows.Controls; +using tabler.Logic.Helper; +using tabler.wpf.Helper; + +namespace tabler.wpf.Controls +{ + /// + /// Interaction logic for LanguageOverviewControl.xaml + /// + public partial class DirectoryFilesOverviewControl : UserControl + { + //private class ListViewWrapperClass : UserControl + //{ + + + + //} + + private List _listFileControls = new List(); + public DirectoryFilesOverviewControl() + { + InitializeComponent(); + } + private DirectoryInfo _di; + public void LoadDirectory(DirectoryInfo di) + { + _di = di; + + var files = di.GetFiles("*stringtable*.xml*", SearchOption.AllDirectories); + + //tc_MainPerProject.Items.Clear(); + + var ts = new StopWatch($"Loading {files.Length} translation files..."); + + foreach (var file in files) + { + var languageControl = new TranslationFileSingleControl(file); + _ = languageControl.LoadStringTableAsync(); + _listFileControls.Add(new ListViewWrapperClass(languageControl, $"{file.Directory.Name}\\{file.Name}")); + } + _listFileControls = _listFileControls.OrderBy(x => x.TranslationFileName).ToList(); + + lvSubProjects.ItemsSource = _listFileControls; + ts.StopAndLog(); + + } + + private void LvSubProjects_SelectionChanged(object sender, SelectionChangedEventArgs e) + { + if (lvSubProjects.SelectedItem == null) + { + return; + } + var control = lvSubProjects.SelectedItem as ListViewWrapperClass; + if (control != null) + { + ccMainContent.Content = control.Control; + control.Control.Load(); + } + + } + } +} diff --git a/tabler.wpf/Controls/Helper_ProgressBar.xaml.cs b/tabler.wpf/Controls/Helper_ProgressBar.xaml.cs index ba61e08..3caffd4 100644 --- a/tabler.wpf/Controls/Helper_ProgressBar.xaml.cs +++ b/tabler.wpf/Controls/Helper_ProgressBar.xaml.cs @@ -54,6 +54,8 @@ public void SetOperationName(string name) private int _currentMax; private int _currentMin; + public bool HandleVisibility { get; set; } = false; + private void UpdateProgressName() { if (Dispatcher.HasShutdownStarted) @@ -70,18 +72,25 @@ private void UpdateProgressName() //if not started or already done if (_currentValue <= 0 || _currentValue >= _currentMax) { - if (Visibility != Visibility.Collapsed) + if (HandleVisibility) { - Visibility = Visibility.Collapsed; + if (Visibility != Visibility.Collapsed) + { + Visibility = Visibility.Collapsed; + } } + return ; } - - //make visible - if (Visibility != Visibility.Visible) + if (HandleVisibility) { - Visibility = Visibility.Visible; + //make visible + if (Visibility != Visibility.Visible) + { + Visibility = Visibility.Visible; + } } + if (_currentMax != pbCurrentProgress.Maximum) { @@ -99,7 +108,8 @@ private void UpdateProgressName() { if (_currentMax == 0) { - lblProgressStatusMessage.Content = Name; + //lblProgressStatusMessage.Content = Name; + lblProgressStatusMessage.Content = "0%"; return; } diff --git a/tabler.wpf/Controls/ItemSelectControl.xaml b/tabler.wpf/Controls/ItemSelectControl.xaml index 50ab8a2..9d23c23 100644 --- a/tabler.wpf/Controls/ItemSelectControl.xaml +++ b/tabler.wpf/Controls/ItemSelectControl.xaml @@ -3,7 +3,6 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" - xmlns:local="clr-namespace:tabler.wpf.Controls" mc:Ignorable="d" d:DesignHeight="200" d:DesignWidth="400"> diff --git a/tabler.wpf/Controls/ListViewWrapperClass.xaml b/tabler.wpf/Controls/ListViewWrapperClass.xaml new file mode 100644 index 0000000..165cef0 --- /dev/null +++ b/tabler.wpf/Controls/ListViewWrapperClass.xaml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + diff --git a/tabler.wpf/Controls/ListViewWrapperClass.xaml.cs b/tabler.wpf/Controls/ListViewWrapperClass.xaml.cs new file mode 100644 index 0000000..66353ef --- /dev/null +++ b/tabler.wpf/Controls/ListViewWrapperClass.xaml.cs @@ -0,0 +1,57 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace tabler.wpf.Controls +{ + /// + /// Interaction logic for ListViewWrapperClass.xaml + /// + public partial class ListViewWrapperClass : UserControl , INotifyPropertyChanged + { + public event PropertyChangedEventHandler PropertyChanged; + private void RaisePropertyChanged(string propName) + { + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propName)); + } + public ListViewWrapperClass(TranslationFileSingleControl control, string name) + { + InitializeComponent(); + this.pb_Progress.SetMax(100,true); + + Control = control; + this.pb_Progress.SetOperationName(""); + this.pb_Progress.Set(control.TranslationProgress.CurrentProgressValue); + Control.TranslationProgress.ProgressChangedEvent += TranslationProgress_ProgressChangedEvent; + TranslationFileName = name; + this.tbName.Content = name; + + } + + private void TranslationProgress_ProgressChangedEvent(int progress, string currentAction) + { + this.pb_Progress.Set(progress); + + } + + + + public TranslationFileSingleControl Control { get; set; } + + public string TranslationFileName { get; set; } + + + } +} diff --git a/tabler.wpf/Controls/TranslationFileOverviewControl.xaml.cs b/tabler.wpf/Controls/TranslationFileOverviewControl.xaml.cs deleted file mode 100644 index fe834f9..0000000 --- a/tabler.wpf/Controls/TranslationFileOverviewControl.xaml.cs +++ /dev/null @@ -1,69 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Data; -using System.Windows.Documents; -using System.Windows.Input; -using System.Windows.Media; -using System.Windows.Media.Imaging; -using System.Windows.Navigation; -using System.Windows.Shapes; -using tabler.Logic.Helper; - -namespace tabler.wpf.Controls -{ - /// - /// Interaction logic for LanguageOverviewControl.xaml - /// - public partial class TranslationFileOverviewControl : UserControl - { - public TranslationFileOverviewControl() - { - InitializeComponent(); - - } - - public List Directorys { get; set; } = new List(); - - public void LoadDirectory(DirectoryInfo di ) - { - if (!DirectoryAlreadyAdded(di)) - { - Directorys.Add(di); - } - else - { - Logger.LogError($"Files of folder: {di.FullName} already added."); - return; - } - - var files = di.GetFiles("*stringtable*.xml*", SearchOption.AllDirectories); - - tc_Main.Items.Clear(); - - foreach (var file in files) - { - var languageControl = new TranslationFileSingleControl(file); - var tiExtended = new Helper_TabItemExtended() { Header = $"{file.Directory.Name}\\{file.Name}", Content = languageControl }; - tiExtended.TabItemSelected += languageControl.Load; - - tc_Main.Items.Add(tiExtended); - } - - } - - private bool DirectoryAlreadyAdded(DirectoryInfo di ) - { - ///todo check for subfolders - return false; - - - } - - } -} diff --git a/tabler.wpf/Controls/TranslationFileSingleControl.xaml b/tabler.wpf/Controls/TranslationFileSingleControl.xaml index 2601291..1bdfcfc 100644 --- a/tabler.wpf/Controls/TranslationFileSingleControl.xaml +++ b/tabler.wpf/Controls/TranslationFileSingleControl.xaml @@ -61,10 +61,6 @@ - - - - - - @@ -144,7 +131,33 @@ - + + + + diff --git a/tabler.wpf/Controls/TranslationFileSingleControl.xaml.cs b/tabler.wpf/Controls/TranslationFileSingleControl.xaml.cs index 65ca129..a48fc03 100644 --- a/tabler.wpf/Controls/TranslationFileSingleControl.xaml.cs +++ b/tabler.wpf/Controls/TranslationFileSingleControl.xaml.cs @@ -50,7 +50,7 @@ public object Convert(object value, Type targetType, object parameter, CultureIn return ((Key_ExtendedWithChangeTracking)value).SystemValues[_propertyName].CurrentValue; } return value; - + } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) @@ -69,6 +69,9 @@ public object ConvertBack(object value, Type targetType, object parameter, Cultu private PropertyGroupDescription _groupDescriptionPackageName = new PropertyGroupDescription(null, new Key_ExtendedWithChangeTrackingValueConverter(Key_ExtendedWithChangeTracking.PackageName_PropertyName)); private PropertyGroupDescription _groupDescriptionIsComplete = new PropertyGroupDescription(null, new Key_ExtendedWithChangeTrackingValueConverter(Key_ExtendedWithChangeTracking.IsComplete_PropertyName)); + public ProgressHelper TranslationProgress { get; set; } + + #region CTOR and Load data public TranslationFileSingleControl(FileInfo file) : this() { @@ -79,6 +82,7 @@ public TranslationFileSingleControl() { InitializeComponent(); + TranslationProgress = new ProgressHelper(); _collViewSource.Source = _keyCollection; _collViewSource.Filter += _collViewSource_Filter; @@ -91,7 +95,7 @@ public TranslationFileSingleControl() dge_Main.ItemsSource = _collViewSource.View; //dge_Main.ItemsSource = _keyCollection; - + var menu = new MenuItem { Header = "Copy complete row(s)" }; menu.Click += copyCompleteRow; this.dge_Main.ContextMenu.Items.Add(menu); @@ -109,22 +113,21 @@ private void Dge_Main_AddingNewItem(object sender, AddingNewItemEventArgs e) e.NewItem = new Key(); } - public void Load() - { - if (AlreadyLoaded) - { - return; - } + private bool _isLoadingStringtable; + private bool _doLoadAll; - try - { - AlreadyLoaded = true; - dge_Main.Columns.Clear(); - StringTable = StringtableHelper.ParseStringtable(CurrentFile); - SetHeader(); - UpdateIsCompleteFlag(); + public async Task LoadStringTableAsync(bool doLoadAll = false) + { + if (StringTable == null) + { + //about 0.03 seconds + //var ts = new StopWatch($"LoadStringTableAsync {CurrentFile.Directory.Name}"); + //ts.Start(); + _isLoadingStringtable = true; + StringTable = await StringtableHelper.ParseStringtable(CurrentFile); + foreach (var package in StringTable.Project.Packages) { foreach (var key in package.Keys) @@ -139,6 +142,104 @@ public void Load() } } } + + var initHeader = TranslationHelper.GetHeaders(StringTable); + + var allItems = new List(); + + foreach (var languageName in Enum.GetNames(typeof(Languages))) + { + allItems.Add(new ItemSelected() + { + DisplayName = languageName, + IsSelected = initHeader.Any(x => x == languageName), + Key = languageName + }); + } + Header = allItems; + + UpdateIsCompleteFlag(); + + + UpdateTranslationProgress(); + + _isLoadingStringtable = false; + if (_doLoadAll || doLoadAll) + { + _doLoadAll = false; + Load(); + } + //ts.StopAndLog(); + + } + } + + private void UpdateTranslationProgress() + { + int progressValue = 0; + if (_keyCollection.Count == 0) + { + progressValue = 100; + } + else + { + progressValue =(int) (100 * ((double)_keyCollection.Count(x => x.IsComplete) / (double)_keyCollection.Count)); + if (progressValue < 0) + { + progressValue = 0; + } + if (progressValue > 100) + { + progressValue = 100; + } + } + + TranslationProgress.FireProgressChangedEvent(progressValue); + } + + public async void Load() + { + if (AlreadyLoaded) + { + return; + } + + if (_isLoadingStringtable) + { + _doLoadAll = true; + return; + } + + _isLoadingStringtable = false; + _doLoadAll = false; + try + { + AlreadyLoaded = true; + + var ts = new StopWatch($"Load {CurrentFile.Directory.Name}") + { + LogStart = true + }; + ts.Start(); + ResetAll(); + + await LoadStringTableAsync(); + + CreateTableColumns(); + ts.StopAndLog("CreateTableColumns done"); + + RefreshTableView(); + + var incomplete = _keyCollection.FirstOrDefault(x => x.IsComplete == false); + + if (incomplete != null) + { + dge_Main.ScrollIntoView(incomplete); + + } + + + ts.StopAndLog("RefreshTableView done"); } catch (Exception ex) { @@ -146,6 +247,20 @@ public void Load() } } + private void RefreshTableView() + { + _collViewSource.View.Refresh(); + } + + private void ResetAll() + { + AlreadyLoaded = false; + _keyCollection.Clear(); + this.StringTable = null; + dge_Main.Columns.Clear(); + + } + #endregion @@ -260,7 +375,7 @@ private void cbGroupByStatus_click(object sender, RoutedEventArgs e) } } - _collViewSource.View.Refresh(); + //_collViewSource.View.Refresh(); } #endregion @@ -268,11 +383,22 @@ private void cbGroupByStatus_click(object sender, RoutedEventArgs e) #region ContextMenu actions private void pasteCompleteRowBelowCurrentRow(object sender, RoutedEventArgs e) { - //var keys = ClipBoardHelper.GetKeyObjectsFromClipboard(); - //if (keys != null && keys.Any()) - //{ - // StringTable.Project.Packages.FirstOrDefault().Keys.AddRange(keys); - //} + var selected = this.dge_Main.SelectedCells.FirstOrDefault(); + if (selected == null) + { + Logger.LogGeneral("Please select a target row first."); + return; + } + + var keys = ClipBoardHelper.GetKeyObjectsFromClipboard(); + + if (keys == null || !keys.Any()) + { + return; + } + + //StringTable.Project.Packages.FirstOrDefault().Keys.AddRange(keys); + } private void copyCompleteRow(object sender, RoutedEventArgs e) @@ -299,7 +425,7 @@ private void btnSave_click(object sender, RoutedEventArgs e) try { StringTable.HasChanges = true; - SaveStringTableFile(CurrentFile, StringTable.FileHasBom,this._keyCollection.ToList(), Header); + SaveStringTableFile(CurrentFile, StringTable.FileHasBom, this._keyCollection.ToList(), Header); } catch (Exception ex) @@ -308,7 +434,7 @@ private void btnSave_click(object sender, RoutedEventArgs e) } } - private void SaveStringTableFile( + private void SaveStringTableFile( FileInfo currentFileInfo, bool fileHasBom, List currentKeys, @@ -375,7 +501,7 @@ private void SaveStringTableFile( foreach (var itemInPackage in package) { - toAddTo.Add(itemInPackage.AsXElement(true,languagesToWrite)); + toAddTo.Add(itemInPackage.AsXElement(true, languagesToWrite)); } } } @@ -394,7 +520,8 @@ private void SaveStringTableFile( private void btnReloadFile_click(object sender, RoutedEventArgs e) { - AlreadyLoaded = false; + ResetAll(); + Load(); } @@ -409,7 +536,7 @@ private void btnSelectLanguages_click(object sender, RoutedEventArgs e) SynchVisibleHeader(); UpdateIsCompleteFlag(); - _collViewSource.View.Refresh(); + } catch (Exception ex) { @@ -422,29 +549,19 @@ private void btnSelectLanguages_click(object sender, RoutedEventArgs e) #region private methods - private void SetHeader() + private void CreateTableColumns() { - var initHeader = TranslationHelper.GetHeaders(StringTable); - - var allItems = new List(); - - foreach (var languageName in Enum.GetNames(typeof(Languages))) - { - allItems.Add(new ItemSelected() { - DisplayName = languageName, - IsSelected = initHeader.Any(x => x == languageName), - Key = languageName }); - } - Header = allItems; //AddColumns(new ItemSelected() { IsSelected = true, DisplayName = Key_ExtendedWithChangeTracking.IsComplete_PropertyName, Key = Key_ExtendedWithChangeTracking.IsComplete_PropertyName }); - AddColumns(new ItemSelected() { + AddColumns(new ItemSelected() + { IsSelected = true, DisplayName = Key_ExtendedWithChangeTracking.Id_PropertyName, - Key = Key_ExtendedWithChangeTracking.Id_PropertyName }, "SystemValues"); + Key = Key_ExtendedWithChangeTracking.Id_PropertyName + }, "SystemValues"); //AddColumns(new ItemSelected() { IsSelected = true, DisplayName = Key_ExtendedWithChangeTracking.Project_PropertyName, Key = Key_ExtendedWithChangeTracking.Project_PropertyName }); - foreach (var header in allItems) + foreach (var header in Header) { AddColumns(header, "Languages"); } @@ -457,7 +574,7 @@ private void AddColumns(ItemSelected header, string dictionaryInKey_ExtendedWith var dgNew = new DataGridTextColumn { // bind to a dictionary property - Binding = new Binding(dictionaryInKey_ExtendedWithChangeTracking+"[" + header.Key + "].CurrentValue"), + Binding = new Binding(dictionaryInKey_ExtendedWithChangeTracking + "[" + header.Key + "].CurrentValue"), Header = header.DisplayName, Width = 100, Visibility = header.IsSelected ? Visibility.Visible : Visibility.Collapsed, @@ -477,6 +594,7 @@ private void UpdateIsCompleteFlag() { item.Update_IsCompletedValue(selectedHeader); } + } private void SynchVisibleHeader() diff --git a/tabler.wpf/Windows/MainWindow.xaml b/tabler.wpf/Windows/MainWindow.xaml index 7df4149..d26af31 100644 --- a/tabler.wpf/Windows/MainWindow.xaml +++ b/tabler.wpf/Windows/MainWindow.xaml @@ -51,9 +51,9 @@ - + - + diff --git a/tabler.wpf/Windows/MainWindow.xaml.cs b/tabler.wpf/Windows/MainWindow.xaml.cs index ad3a818..b9be6be 100644 --- a/tabler.wpf/Windows/MainWindow.xaml.cs +++ b/tabler.wpf/Windows/MainWindow.xaml.cs @@ -1,28 +1,12 @@ using Microsoft.WindowsAPICodePack.Dialogs; using System; -using System.Collections.Generic; using System.Globalization; using System.IO; -using System.Linq; using System.Reflection; -using System.Text; -using System.Threading.Tasks; using System.Windows; -using System.Windows.Controls; -using System.Windows.Data; -using System.Windows.Documents; -using System.Windows.Input; using System.Windows.Markup; -using System.Windows.Media; -using System.Windows.Media.Imaging; -using System.Windows.Navigation; -using System.Windows.Shapes; using tabler.Logic.Classes; -using tabler.Logic.Enums; using tabler.Logic.Helper; -using tabler.wpf.Container; -using tabler.wpf.Controls; -using tabler.wpf.Helper; using Control = System.Windows.Controls.Control; namespace tabler.wpf @@ -47,7 +31,7 @@ public MainWindow() InitializeComponent(); Logger.LogMessageWithTypeArrived += ctrl_HelperLogMessages.AddMessage; - + TranslationHelper = new TranslationHelper(); } @@ -58,24 +42,24 @@ private void btn_openLanguageFile(object sender, RoutedEventArgs e) var dlg = new CommonOpenFileDialog(); dlg.Title = "Select mod/mission folder, all stringtable.xml files in subfolders will be opened."; dlg.IsFolderPicker = true; - dlg.AddToMostRecentlyUsedList = true; + dlg.AddToMostRecentlyUsedList = false; dlg.AllowNonFileSystemItems = false; dlg.DefaultDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyComputer); - dlg.EnsureFileExists = true; - dlg.EnsurePathExists = true; + dlg.EnsureFileExists = false; + dlg.EnsurePathExists = false; dlg.EnsureReadOnly = false; - dlg.EnsureValidNames = true; + dlg.EnsureValidNames = false; dlg.Multiselect = false; - dlg.ShowPlacesList = true; + dlg.ShowPlacesList = false; if (!string.IsNullOrEmpty(ConfigHelper.CurrentSettings.LastPathOfDataFiles)) { dlg.InitialDirectory = ConfigHelper.CurrentSettings.LastPathOfDataFiles; } - + var result = dlg.ShowDialog(); - if (result == CommonFileDialogResult.Ok ) + if (result == CommonFileDialogResult.Ok) { ctrl_languageOverview.LoadDirectory(new DirectoryInfo(dlg.FileName));//);new System.IO.DirectoryInfo(@"I:\arbeit\GitHub\Mamilacan\tabler\tabler\tabler.wpf\ExampleData")); if (ConfigHelper.CurrentSettings.LastPathOfDataFiles != dlg.FileName) @@ -85,11 +69,6 @@ private void btn_openLanguageFile(object sender, RoutedEventArgs e) } } - //// OpenOpenModFolderDialog(); - //if (MessageBox.Show(Properties.Resources.GridUI_Discard_all_changes, Properties.Resources.GridUI_Open,MessageBoxButton.YesNo) == MessageBoxResult.Yes) - //{ - // OpenOpenModFolderDialog(); - //} } catch (Exception ex) { @@ -116,12 +95,12 @@ private void CheckForNewVersion() { var gh = new GitHubVersionHelper(); var productVersion = Assembly.GetExecutingAssembly().GetName().Version; - + _newerRelease = gh.CheckForNewVersion(productVersion.ToString()); if (_newerRelease != null) { - mi_getNewVersion.Visibility = Visibility.Visible; + mi_getNewVersion.Visibility = Visibility.Visible; Logger.LogGeneral($"{Resources["GridUI_CheckForNewVersion_New_version_available"]} -> {_newerRelease.Version}"); Logger.LogGeneral($"{Resources["GridUI_CheckForNewVersion_Download_the_new_version_at"]}: {_newerRelease.HtmlUrl}"); } @@ -159,7 +138,7 @@ private void CheckForNewVersion() private void Window_Loaded(object sender, RoutedEventArgs e) { - + } private void languageSelected(object sender, RoutedEventArgs e) @@ -168,7 +147,7 @@ private void languageSelected(object sender, RoutedEventArgs e) ConfigHelper.CurrentSettings.Language = selectedItem.Tag as string; ConfigHelper.SaveSettings(); Logger.LogGeneral($"Language changed to: {ConfigHelper.CurrentSettings.Language}. Restart required."); - + } private void btn_exit_click(object sender, RoutedEventArgs e) diff --git a/tabler.wpf/tabler.wpf.csproj b/tabler.wpf/tabler.wpf.csproj index 1964b5d..12dd9fa 100644 --- a/tabler.wpf/tabler.wpf.csproj +++ b/tabler.wpf/tabler.wpf.csproj @@ -95,7 +95,11 @@ Designer MSBuild:Compile - + + Designer + MSBuild:Compile + + Designer MSBuild:Compile @@ -127,8 +131,11 @@ ItemSelectControl.xaml - - TranslationFileOverviewControl.xaml + + DirectoryFilesOverviewControl.xaml + + + ListViewWrapperClass.xaml LogMessages_Window.xaml