From 0b0508b042ab81dd6aff1b6be9f020377d13e296 Mon Sep 17 00:00:00 2001 From: Maier Stephan SI Date: Mon, 16 Jan 2023 16:04:47 +0100 Subject: [PATCH] Sicherung --- FSI.Lib/FSI.Lib.sln | 6 +- FSI.Lib/FSI.Lib/FSI.Lib.csproj | 1 + FSI.Lib/FSI.Lib/Guis/AutoPw/FrmMain.xaml.cs | 18 +- FSI.Lib/FSI.Lib/Guis/Folder.Mgt/FrmMain.xaml | 2 - FSI.Lib/FSI.Lib/Guis/Folder.Mgt/ViewModel.cs | 3 + FSI.Lib/FSI.Lib/Guis/IbaDirSync/Model.cs | 9 + FSI.Lib/FSI.Lib/Guis/IbaDirSync/Model/Iba.cs | 9 - .../ViewModelIba.cs => ViewModel.cs} | 53 +- .../{Model/Window.cs => Model.cs} | 5 +- .../ViewModelWindow.cs => ViewModel.cs} | 55 +- .../Guis/SieTiaWinCCMsgMgt/FrmMain.xaml.cs | 2 +- .../{Model/WinCC.cs => Model.cs} | 11 +- .../ViewModelWinCC.cs => ViewModel.cs} | 91 +-- FSI.Lib/FSI.Lib/Guis/TxtToClip.Mgt/Model.cs | 6 +- .../FSI.Lib/Guis/TxtToClip.Mgt/ViewModel.cs | 2 + FSI.Lib/NLogViewer/ActionCommand.cs | 42 ++ .../Extensions/DependencyObjectExtensions.cs | 72 ++ .../NLogViewer/Helper/AutoSizedGridView.cs | 43 ++ .../ConverterGridViewColumn.cs | 59 ++ .../ListViewLayoutManager/FixedColumn.cs | 61 ++ .../ImageGridViewColumn.cs | 58 ++ .../ListViewLayoutManager/LayoutColumn.cs | 41 ++ .../ListViewLayoutManager.cs | 623 ++++++++++++++++++ .../ProportionalColumn.cs | 61 ++ .../ListViewLayoutManager/RangeColumn.cs | 136 ++++ FSI.Lib/NLogViewer/Helper/PredicateBuilder.cs | 28 + .../Images/Glyphs/SortDownArrow.png | Bin 0 -> 264 bytes .../NLogViewer/Images/Glyphs/SortUpArrow.png | Bin 0 -> 278 bytes FSI.Lib/NLogViewer/Images/Large/Add.png | Bin 0 -> 2835 bytes FSI.Lib/NLogViewer/Images/Large/Context.png | Bin 0 -> 1566 bytes FSI.Lib/NLogViewer/Images/Large/Debug.png | Bin 0 -> 4039 bytes .../NLogViewer/Images/Large/DebugSource.png | Bin 0 -> 984 bytes FSI.Lib/NLogViewer/Images/Large/Error.png | Bin 0 -> 5847 bytes FSI.Lib/NLogViewer/Images/Large/Exception.png | Bin 0 -> 6437 bytes FSI.Lib/NLogViewer/Images/Large/Exit.png | Bin 0 -> 6769 bytes FSI.Lib/NLogViewer/Images/Large/Export.png | Bin 0 -> 4049 bytes FSI.Lib/NLogViewer/Images/Large/Fatal.png | Bin 0 -> 5691 bytes FSI.Lib/NLogViewer/Images/Large/Info.png | Bin 0 -> 4433 bytes FSI.Lib/NLogViewer/Images/Large/Network.png | Bin 0 -> 2356 bytes FSI.Lib/NLogViewer/Images/Large/Open.png | Bin 0 -> 5339 bytes FSI.Lib/NLogViewer/Images/Large/Save.png | Bin 0 -> 2986 bytes FSI.Lib/NLogViewer/Images/Large/Settings.png | Bin 0 -> 7121 bytes FSI.Lib/NLogViewer/Images/Large/Thread.png | Bin 0 -> 10896 bytes FSI.Lib/NLogViewer/Images/Large/Trace.png | Bin 0 -> 2397 bytes FSI.Lib/NLogViewer/Images/Large/Unknown.png | Bin 0 -> 2165 bytes FSI.Lib/NLogViewer/Images/Large/Warning.png | Bin 0 -> 5778 bytes FSI.Lib/NLogViewer/Images/Medium/Add.png | Bin 0 -> 1443 bytes FSI.Lib/NLogViewer/Images/Medium/Debug.png | Bin 0 -> 1667 bytes FSI.Lib/NLogViewer/Images/Medium/Error.png | Bin 0 -> 2394 bytes .../NLogViewer/Images/Medium/Exception.png | Bin 0 -> 2462 bytes FSI.Lib/NLogViewer/Images/Medium/Exit.png | Bin 0 -> 4758 bytes FSI.Lib/NLogViewer/Images/Medium/Export.png | Bin 0 -> 1738 bytes FSI.Lib/NLogViewer/Images/Medium/Fatal.png | Bin 0 -> 2073 bytes FSI.Lib/NLogViewer/Images/Medium/Info.png | Bin 0 -> 1693 bytes FSI.Lib/NLogViewer/Images/Medium/Network.png | Bin 0 -> 787 bytes FSI.Lib/NLogViewer/Images/Medium/Open.png | Bin 0 -> 2032 bytes FSI.Lib/NLogViewer/Images/Medium/Save.png | Bin 0 -> 1481 bytes FSI.Lib/NLogViewer/Images/Medium/Settings.png | Bin 0 -> 2911 bytes FSI.Lib/NLogViewer/Images/Medium/Thread.png | Bin 0 -> 3331 bytes FSI.Lib/NLogViewer/Images/Medium/Trace.png | Bin 0 -> 1164 bytes FSI.Lib/NLogViewer/Images/Medium/Unknown.png | Bin 0 -> 1116 bytes FSI.Lib/NLogViewer/Images/Medium/Warning.png | Bin 0 -> 1975 bytes FSI.Lib/NLogViewer/Images/Small/Add.png | Bin 0 -> 1090 bytes FSI.Lib/NLogViewer/Images/Small/Clear.png | Bin 0 -> 475 bytes FSI.Lib/NLogViewer/Images/Small/Clock.png | Bin 0 -> 365 bytes FSI.Lib/NLogViewer/Images/Small/Context.png | Bin 0 -> 451 bytes FSI.Lib/NLogViewer/Images/Small/Debug.png | Bin 0 -> 774 bytes .../NLogViewer/Images/Small/DebugSource.png | Bin 0 -> 400 bytes FSI.Lib/NLogViewer/Images/Small/Error.png | Bin 0 -> 782 bytes FSI.Lib/NLogViewer/Images/Small/Exception.png | Bin 0 -> 943 bytes FSI.Lib/NLogViewer/Images/Small/Exit.png | Bin 0 -> 629 bytes FSI.Lib/NLogViewer/Images/Small/Export.png | Bin 0 -> 1196 bytes FSI.Lib/NLogViewer/Images/Small/Fatal.png | Bin 0 -> 589 bytes FSI.Lib/NLogViewer/Images/Small/Info.png | Bin 0 -> 778 bytes FSI.Lib/NLogViewer/Images/Small/Layout.png | Bin 0 -> 372 bytes .../NLogViewer/Images/Small/MonoLightning.png | Bin 0 -> 520 bytes FSI.Lib/NLogViewer/Images/Small/Network.png | Bin 0 -> 506 bytes FSI.Lib/NLogViewer/Images/Small/Open.png | Bin 0 -> 1227 bytes FSI.Lib/NLogViewer/Images/Small/Pause.png | Bin 0 -> 1261 bytes FSI.Lib/NLogViewer/Images/Small/Save.png | Bin 0 -> 1026 bytes .../NLogViewer/Images/Small/ScrollDown.png | Bin 0 -> 623 bytes FSI.Lib/NLogViewer/Images/Small/Settings.png | Bin 0 -> 1306 bytes FSI.Lib/NLogViewer/Images/Small/Thread.png | Bin 0 -> 1419 bytes FSI.Lib/NLogViewer/Images/Small/Trace.png | Bin 0 -> 631 bytes FSI.Lib/NLogViewer/Images/Small/Unknown.png | Bin 0 -> 582 bytes FSI.Lib/NLogViewer/Images/Small/Warning.png | Bin 0 -> 813 bytes FSI.Lib/NLogViewer/NLogViewer.csproj | 154 +++++ FSI.Lib/NLogViewer/NLogViewer.xaml | 213 ++++++ FSI.Lib/NLogViewer/NLogViewer.xaml.cs | 543 +++++++++++++++ .../Resolver/ILogEventInfoResolver.cs | 12 + FSI.Lib/NLogViewer/Resolver/IdResolver.cs | 12 + .../NLogViewer/Resolver/LoggerNameResolver.cs | 12 + .../NLogViewer/Resolver/MessageResolver.cs | 21 + .../NLogViewer/Resolver/TimeStampResolver.cs | 12 + FSI.Lib/NLogViewer/ScrollingHelper.cs | 44 ++ FSI.Lib/NLogViewer/Targets/CacheTarget.cs | 93 +++ .../ILogEventResolverToStringConverter.cs | 23 + FSI.Lib/NLogViewer/global.json | 6 + 98 files changed, 2454 insertions(+), 188 deletions(-) create mode 100644 FSI.Lib/FSI.Lib/Guis/IbaDirSync/Model.cs delete mode 100644 FSI.Lib/FSI.Lib/Guis/IbaDirSync/Model/Iba.cs rename FSI.Lib/FSI.Lib/Guis/IbaDirSync/{ViewModel/ViewModelIba.cs => ViewModel.cs} (57%) rename FSI.Lib/FSI.Lib/Guis/SetSizePosExWindow/{Model/Window.cs => Model.cs} (78%) rename FSI.Lib/FSI.Lib/Guis/SetSizePosExWindow/{ViewModel/ViewModelWindow.cs => ViewModel.cs} (87%) rename FSI.Lib/FSI.Lib/Guis/SieTiaWinCCMsgMgt/{Model/WinCC.cs => Model.cs} (57%) rename FSI.Lib/FSI.Lib/Guis/SieTiaWinCCMsgMgt/{ViewModel/ViewModelWinCC.cs => ViewModel.cs} (69%) create mode 100644 FSI.Lib/NLogViewer/ActionCommand.cs create mode 100644 FSI.Lib/NLogViewer/Extensions/DependencyObjectExtensions.cs create mode 100644 FSI.Lib/NLogViewer/Helper/AutoSizedGridView.cs create mode 100644 FSI.Lib/NLogViewer/Helper/ListViewLayoutManager/ConverterGridViewColumn.cs create mode 100644 FSI.Lib/NLogViewer/Helper/ListViewLayoutManager/FixedColumn.cs create mode 100644 FSI.Lib/NLogViewer/Helper/ListViewLayoutManager/ImageGridViewColumn.cs create mode 100644 FSI.Lib/NLogViewer/Helper/ListViewLayoutManager/LayoutColumn.cs create mode 100644 FSI.Lib/NLogViewer/Helper/ListViewLayoutManager/ListViewLayoutManager.cs create mode 100644 FSI.Lib/NLogViewer/Helper/ListViewLayoutManager/ProportionalColumn.cs create mode 100644 FSI.Lib/NLogViewer/Helper/ListViewLayoutManager/RangeColumn.cs create mode 100644 FSI.Lib/NLogViewer/Helper/PredicateBuilder.cs create mode 100644 FSI.Lib/NLogViewer/Images/Glyphs/SortDownArrow.png create mode 100644 FSI.Lib/NLogViewer/Images/Glyphs/SortUpArrow.png create mode 100644 FSI.Lib/NLogViewer/Images/Large/Add.png create mode 100644 FSI.Lib/NLogViewer/Images/Large/Context.png create mode 100644 FSI.Lib/NLogViewer/Images/Large/Debug.png create mode 100644 FSI.Lib/NLogViewer/Images/Large/DebugSource.png create mode 100644 FSI.Lib/NLogViewer/Images/Large/Error.png create mode 100644 FSI.Lib/NLogViewer/Images/Large/Exception.png create mode 100644 FSI.Lib/NLogViewer/Images/Large/Exit.png create mode 100644 FSI.Lib/NLogViewer/Images/Large/Export.png create mode 100644 FSI.Lib/NLogViewer/Images/Large/Fatal.png create mode 100644 FSI.Lib/NLogViewer/Images/Large/Info.png create mode 100644 FSI.Lib/NLogViewer/Images/Large/Network.png create mode 100644 FSI.Lib/NLogViewer/Images/Large/Open.png create mode 100644 FSI.Lib/NLogViewer/Images/Large/Save.png create mode 100644 FSI.Lib/NLogViewer/Images/Large/Settings.png create mode 100644 FSI.Lib/NLogViewer/Images/Large/Thread.png create mode 100644 FSI.Lib/NLogViewer/Images/Large/Trace.png create mode 100644 FSI.Lib/NLogViewer/Images/Large/Unknown.png create mode 100644 FSI.Lib/NLogViewer/Images/Large/Warning.png create mode 100644 FSI.Lib/NLogViewer/Images/Medium/Add.png create mode 100644 FSI.Lib/NLogViewer/Images/Medium/Debug.png create mode 100644 FSI.Lib/NLogViewer/Images/Medium/Error.png create mode 100644 FSI.Lib/NLogViewer/Images/Medium/Exception.png create mode 100644 FSI.Lib/NLogViewer/Images/Medium/Exit.png create mode 100644 FSI.Lib/NLogViewer/Images/Medium/Export.png create mode 100644 FSI.Lib/NLogViewer/Images/Medium/Fatal.png create mode 100644 FSI.Lib/NLogViewer/Images/Medium/Info.png create mode 100644 FSI.Lib/NLogViewer/Images/Medium/Network.png create mode 100644 FSI.Lib/NLogViewer/Images/Medium/Open.png create mode 100644 FSI.Lib/NLogViewer/Images/Medium/Save.png create mode 100644 FSI.Lib/NLogViewer/Images/Medium/Settings.png create mode 100644 FSI.Lib/NLogViewer/Images/Medium/Thread.png create mode 100644 FSI.Lib/NLogViewer/Images/Medium/Trace.png create mode 100644 FSI.Lib/NLogViewer/Images/Medium/Unknown.png create mode 100644 FSI.Lib/NLogViewer/Images/Medium/Warning.png create mode 100644 FSI.Lib/NLogViewer/Images/Small/Add.png create mode 100644 FSI.Lib/NLogViewer/Images/Small/Clear.png create mode 100644 FSI.Lib/NLogViewer/Images/Small/Clock.png create mode 100644 FSI.Lib/NLogViewer/Images/Small/Context.png create mode 100644 FSI.Lib/NLogViewer/Images/Small/Debug.png create mode 100644 FSI.Lib/NLogViewer/Images/Small/DebugSource.png create mode 100644 FSI.Lib/NLogViewer/Images/Small/Error.png create mode 100644 FSI.Lib/NLogViewer/Images/Small/Exception.png create mode 100644 FSI.Lib/NLogViewer/Images/Small/Exit.png create mode 100644 FSI.Lib/NLogViewer/Images/Small/Export.png create mode 100644 FSI.Lib/NLogViewer/Images/Small/Fatal.png create mode 100644 FSI.Lib/NLogViewer/Images/Small/Info.png create mode 100644 FSI.Lib/NLogViewer/Images/Small/Layout.png create mode 100644 FSI.Lib/NLogViewer/Images/Small/MonoLightning.png create mode 100644 FSI.Lib/NLogViewer/Images/Small/Network.png create mode 100644 FSI.Lib/NLogViewer/Images/Small/Open.png create mode 100644 FSI.Lib/NLogViewer/Images/Small/Pause.png create mode 100644 FSI.Lib/NLogViewer/Images/Small/Save.png create mode 100644 FSI.Lib/NLogViewer/Images/Small/ScrollDown.png create mode 100644 FSI.Lib/NLogViewer/Images/Small/Settings.png create mode 100644 FSI.Lib/NLogViewer/Images/Small/Thread.png create mode 100644 FSI.Lib/NLogViewer/Images/Small/Trace.png create mode 100644 FSI.Lib/NLogViewer/Images/Small/Unknown.png create mode 100644 FSI.Lib/NLogViewer/Images/Small/Warning.png create mode 100644 FSI.Lib/NLogViewer/NLogViewer.csproj create mode 100644 FSI.Lib/NLogViewer/NLogViewer.xaml create mode 100644 FSI.Lib/NLogViewer/NLogViewer.xaml.cs create mode 100644 FSI.Lib/NLogViewer/Resolver/ILogEventInfoResolver.cs create mode 100644 FSI.Lib/NLogViewer/Resolver/IdResolver.cs create mode 100644 FSI.Lib/NLogViewer/Resolver/LoggerNameResolver.cs create mode 100644 FSI.Lib/NLogViewer/Resolver/MessageResolver.cs create mode 100644 FSI.Lib/NLogViewer/Resolver/TimeStampResolver.cs create mode 100644 FSI.Lib/NLogViewer/ScrollingHelper.cs create mode 100644 FSI.Lib/NLogViewer/Targets/CacheTarget.cs create mode 100644 FSI.Lib/NLogViewer/XamlMultiValueConverter/ILogEventResolverToStringConverter.cs create mode 100644 FSI.Lib/NLogViewer/global.json diff --git a/FSI.Lib/FSI.Lib.sln b/FSI.Lib/FSI.Lib.sln index 602fb0e..a5645c1 100644 --- a/FSI.Lib/FSI.Lib.sln +++ b/FSI.Lib/FSI.Lib.sln @@ -1,9 +1,9 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.31321.278 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.32112.339 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FSI.Lib", "FSI.Lib\FSI.Lib.csproj", "{1394B606-4AAC-4D8D-BAF4-DB38E1FCEAAA}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FSI.Lib", "FSI.Lib\FSI.Lib.csproj", "{1394B606-4AAC-4D8D-BAF4-DB38E1FCEAAA}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/FSI.Lib/FSI.Lib/FSI.Lib.csproj b/FSI.Lib/FSI.Lib/FSI.Lib.csproj index 24af52c..8539040 100644 --- a/FSI.Lib/FSI.Lib/FSI.Lib.csproj +++ b/FSI.Lib/FSI.Lib/FSI.Lib.csproj @@ -34,6 +34,7 @@ + diff --git a/FSI.Lib/FSI.Lib/Guis/AutoPw/FrmMain.xaml.cs b/FSI.Lib/FSI.Lib/Guis/AutoPw/FrmMain.xaml.cs index dbdd48a..0d693f3 100644 --- a/FSI.Lib/FSI.Lib/Guis/AutoPw/FrmMain.xaml.cs +++ b/FSI.Lib/FSI.Lib/Guis/AutoPw/FrmMain.xaml.cs @@ -1,6 +1,9 @@ -using System; +using Microsoft.Extensions.Logging; +using NLog; +using System; using System.Collections.Generic; using System.Linq; +using System.Reflection; using System.Text; using System.Threading.Tasks; using System.Windows; @@ -19,15 +22,17 @@ namespace FSI.Lib.Guis.AutoPw /// public partial class FrmMain : Window { + private Logger _log; public bool CloseAtLostFocus { get; set; } public bool PwOk { get; set; } public FrmMain() { InitializeComponent(); + _log = LogManager.GetCurrentClassLogger(); BtnOk.IsEnabled = false; Deactivated += FrmMain_Deactivated; - DataContext = new MVVM.ViewModel.CurrentTimeViewModel(); + DataContext = new MVVM.ViewModel.CurrentTimeViewModel(); } private void FrmMain_Deactivated(object sender, System.EventArgs e) @@ -38,6 +43,8 @@ namespace FSI.Lib.Guis.AutoPw private void BtnOk_Click(object sender, RoutedEventArgs e) { + + _log.Info(GetType().Namespace); Close(); } @@ -79,11 +86,6 @@ namespace FSI.Lib.Guis.AutoPw } Close(); - } - - private void TbPw_KeyDown_1(object sender, KeyEventArgs e) - { - - } + } } } diff --git a/FSI.Lib/FSI.Lib/Guis/Folder.Mgt/FrmMain.xaml b/FSI.Lib/FSI.Lib/Guis/Folder.Mgt/FrmMain.xaml index 065826e..5994784 100644 --- a/FSI.Lib/FSI.Lib/Guis/Folder.Mgt/FrmMain.xaml +++ b/FSI.Lib/FSI.Lib/Guis/Folder.Mgt/FrmMain.xaml @@ -148,8 +148,6 @@ - diff --git a/FSI.Lib/FSI.Lib/Guis/Folder.Mgt/ViewModel.cs b/FSI.Lib/FSI.Lib/Guis/Folder.Mgt/ViewModel.cs index de51066..538f021 100644 --- a/FSI.Lib/FSI.Lib/Guis/Folder.Mgt/ViewModel.cs +++ b/FSI.Lib/FSI.Lib/Guis/Folder.Mgt/ViewModel.cs @@ -174,6 +174,9 @@ namespace FSI.Lib.Guis.Folder.Mgt newDatas.Add(newData); } + + newDatas = new ObservableCollection(newDatas.OrderBy(i => i.DescriptionDtl)); + return newDatas; } } diff --git a/FSI.Lib/FSI.Lib/Guis/IbaDirSync/Model.cs b/FSI.Lib/FSI.Lib/Guis/IbaDirSync/Model.cs new file mode 100644 index 0000000..bc89075 --- /dev/null +++ b/FSI.Lib/FSI.Lib/Guis/IbaDirSync/Model.cs @@ -0,0 +1,9 @@ +namespace FSI.Lib.Guis.IbaDirSync +{ + public interface IInterface + { + public bool AutoStart { get; set; } + public string Source { get; set; } + public string Destination { get; set; } + } +} diff --git a/FSI.Lib/FSI.Lib/Guis/IbaDirSync/Model/Iba.cs b/FSI.Lib/FSI.Lib/Guis/IbaDirSync/Model/Iba.cs deleted file mode 100644 index aaa43ee..0000000 --- a/FSI.Lib/FSI.Lib/Guis/IbaDirSync/Model/Iba.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace FSI.Lib.Guis.IbaDirSync.Model -{ - public class Iba - { - public string Source { get; set; } - public string Destination { get; set; } - public bool AutoStart { get; set; } - } -} diff --git a/FSI.Lib/FSI.Lib/Guis/IbaDirSync/ViewModel/ViewModelIba.cs b/FSI.Lib/FSI.Lib/Guis/IbaDirSync/ViewModel.cs similarity index 57% rename from FSI.Lib/FSI.Lib/Guis/IbaDirSync/ViewModel/ViewModelIba.cs rename to FSI.Lib/FSI.Lib/Guis/IbaDirSync/ViewModel.cs index 06a9d3e..ea63b28 100644 --- a/FSI.Lib/FSI.Lib/Guis/IbaDirSync/ViewModel/ViewModelIba.cs +++ b/FSI.Lib/FSI.Lib/Guis/IbaDirSync/ViewModel.cs @@ -1,59 +1,30 @@ -using FSI.Lib.Guis.IbaDirSync.Model; -using FSI.Lib.MVVM; +using FSI.Lib.MVVM; using RoboSharp; using System.Text; using System.Windows.Input; -namespace FSI.Lib.Guis.IbaDirSync.ViewModel +namespace FSI.Lib.Guis.IbaDirSync { - public class ViewModelIba : ViewModelBase + public class ViewModel : ViewModelBase { private ICommand _cmdStart; private ICommand _cmdStop; - private Iba _iba; - - public ViewModelIba() + public ViewModel() { - Iba = new Model.Iba(); - Init(); - } - - public ViewModelIba(string destination, string source, bool autoStart) - { - _iba = new Model.Iba() - { - Destination = destination, - Source = source, - AutoStart = autoStart, - }; - Init(); - } - - private void Init() - { _cmdStart = new RelayCommand(ExecuteStart, CanExecuteStart); _cmdStop = new RelayCommand(ExecuteStop, CanExecuteStop); Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); - RoboCopy = new RoboSharp.RoboCommand(); - - if (_iba.AutoStart) - ExecuteStart(null); + RoboCopy = new RoboSharp.RoboCommand(); } - public Model.Iba Iba + public IInterface Data { get; set; } + + public void Init() { - get + if (Data.AutoStart) { - return _iba; - } - set - { - if (_iba != value & _iba != null) - { - _iba = value; - OnPropertyChanged(); - } + ExecuteStart(null); } } @@ -93,8 +64,8 @@ namespace FSI.Lib.Guis.IbaDirSync.ViewModel private void ExecuteStart(object obj) { - RoboCopy.CopyOptions.Source = Iba.Source; - RoboCopy.CopyOptions.Destination = Iba.Destination; + RoboCopy.CopyOptions.Source = Data.Source; + RoboCopy.CopyOptions.Destination = Data.Destination; RoboCopy.CopyOptions.CopySubdirectories = true; RoboCopy.CopyOptions.MonitorSourceChangesLimit = 1; RoboCopy.StopIfDisposing = true; diff --git a/FSI.Lib/FSI.Lib/Guis/SetSizePosExWindow/Model/Window.cs b/FSI.Lib/FSI.Lib/Guis/SetSizePosExWindow/Model.cs similarity index 78% rename from FSI.Lib/FSI.Lib/Guis/SetSizePosExWindow/Model/Window.cs rename to FSI.Lib/FSI.Lib/Guis/SetSizePosExWindow/Model.cs index 049f490..3d60995 100644 --- a/FSI.Lib/FSI.Lib/Guis/SetSizePosExWindow/Model/Window.cs +++ b/FSI.Lib/FSI.Lib/Guis/SetSizePosExWindow/Model.cs @@ -4,13 +4,14 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace FSI.Lib.Guis.SetSizePosExWindow.Model +namespace FSI.Lib.Guis.SetSizePosExWindow { - public class Window + public class IInterface { public string Bezeichnung { get; set; } public string Name { get; set; } public string ClassName { get; set; } + public bool AutoStart { get; set; } public int Height { get; set; } public int Width { get; set; } public int X { get; set; } diff --git a/FSI.Lib/FSI.Lib/Guis/SetSizePosExWindow/ViewModel/ViewModelWindow.cs b/FSI.Lib/FSI.Lib/Guis/SetSizePosExWindow/ViewModel.cs similarity index 87% rename from FSI.Lib/FSI.Lib/Guis/SetSizePosExWindow/ViewModel/ViewModelWindow.cs rename to FSI.Lib/FSI.Lib/Guis/SetSizePosExWindow/ViewModel.cs index b54cf42..22de213 100644 --- a/FSI.Lib/FSI.Lib/Guis/SetSizePosExWindow/ViewModel/ViewModelWindow.cs +++ b/FSI.Lib/FSI.Lib/Guis/SetSizePosExWindow/ViewModel.cs @@ -1,5 +1,4 @@ -using FSI.Lib.Guis.SetSizePosExWindow.Model; -using FSI.Lib.MVVM; +using FSI.Lib.MVVM; using System; using System.Collections.ObjectModel; using System.ComponentModel; @@ -8,9 +7,9 @@ using System.Threading; using System.Threading.Tasks; using System.Windows.Input; -namespace FSI.Lib.Guis.SetSizePosExWindow.ViewModel +namespace FSI.Lib.Guis.SetSizePosExWindow { - public class ViewModelWindow : ViewModelBase + public class ViewModel : ViewModelBase { [DllImport("user32.dll")] public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); @@ -65,39 +64,15 @@ namespace FSI.Lib.Guis.SetSizePosExWindow.ViewModel private BackgroundWorker backgroundWorker; private ICommand _cmdStart; private ICommand _cmdStop; - private ObservableCollection _windows; + private ObservableCollection _windows; private int _updateIntervall; private bool _autoStart; - private Window _selectedWindow; + private IInterface _selectedWindow; - public ViewModelWindow() + public ViewModel() { - _windows = new ObservableCollection(); + _windows = new ObservableCollection(); - Init(); - - if (AutoStart) - { - ExecuteStart(null); - } - } - - public ViewModelWindow(bool autoStart) - { - _windows = new ObservableCollection(); - - Init(); - - AutoStart = autoStart; - - if (AutoStart) - { - ExecuteStart(null); - } - } - - private void Init() - { _cmdStart = new RelayCommand(ExecuteStart, CanExecuteStart); _cmdStop = new RelayCommand(ExecuteStop, CanExecuteStop); @@ -110,7 +85,17 @@ namespace FSI.Lib.Guis.SetSizePosExWindow.ViewModel backgroundWorker.ProgressChanged += BackgroundWorker_ProgressChanged; } - public ObservableCollection Windows + public IInterface Data { get; set; } + + public void Init() + { + if (Data.AutoStart) + { + ExecuteStart(null); + } + } + + public ObservableCollection Windows { get { @@ -126,7 +111,7 @@ namespace FSI.Lib.Guis.SetSizePosExWindow.ViewModel } } - public Model.Window SelectedWindow + public IInterface SelectedWindow { get { @@ -232,7 +217,7 @@ namespace FSI.Lib.Guis.SetSizePosExWindow.ViewModel } else { - foreach (Window window in Windows) + foreach (IInterface window in Windows) { // Perform a time consuming operation and report progress. Thread.Sleep(UpdateIntervall); diff --git a/FSI.Lib/FSI.Lib/Guis/SieTiaWinCCMsgMgt/FrmMain.xaml.cs b/FSI.Lib/FSI.Lib/Guis/SieTiaWinCCMsgMgt/FrmMain.xaml.cs index cad8808..8ab58bb 100644 --- a/FSI.Lib/FSI.Lib/Guis/SieTiaWinCCMsgMgt/FrmMain.xaml.cs +++ b/FSI.Lib/FSI.Lib/Guis/SieTiaWinCCMsgMgt/FrmMain.xaml.cs @@ -28,7 +28,7 @@ namespace FSI.Lib.Guis.SieTiaWinCCMsgMgt private void btnStart_Click(object sender, RoutedEventArgs e) { - //WinCC.Start(); + // WinCC.Start(); CtrlMgt(); } diff --git a/FSI.Lib/FSI.Lib/Guis/SieTiaWinCCMsgMgt/Model/WinCC.cs b/FSI.Lib/FSI.Lib/Guis/SieTiaWinCCMsgMgt/Model.cs similarity index 57% rename from FSI.Lib/FSI.Lib/Guis/SieTiaWinCCMsgMgt/Model/WinCC.cs rename to FSI.Lib/FSI.Lib/Guis/SieTiaWinCCMsgMgt/Model.cs index b57c29c..033d4c3 100644 --- a/FSI.Lib/FSI.Lib/Guis/SieTiaWinCCMsgMgt/Model/WinCC.cs +++ b/FSI.Lib/FSI.Lib/Guis/SieTiaWinCCMsgMgt/Model.cs @@ -1,12 +1,8 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using System.Collections.Generic; -namespace FSI.Lib.Guis.SieTiaWinCCMsgMgt.Model +namespace FSI.Lib.Guis.SieTiaWinCCMsgMgt { - public class WinCC + public interface IInterface { public bool AutoStart { get; set; } public int UpdateIntervall { get; set; } @@ -14,4 +10,5 @@ namespace FSI.Lib.Guis.SieTiaWinCCMsgMgt.Model public string WindowsClassName { get; set; } public string ButtonName { get; set; } } + } diff --git a/FSI.Lib/FSI.Lib/Guis/SieTiaWinCCMsgMgt/ViewModel/ViewModelWinCC.cs b/FSI.Lib/FSI.Lib/Guis/SieTiaWinCCMsgMgt/ViewModel.cs similarity index 69% rename from FSI.Lib/FSI.Lib/Guis/SieTiaWinCCMsgMgt/ViewModel/ViewModelWinCC.cs rename to FSI.Lib/FSI.Lib/Guis/SieTiaWinCCMsgMgt/ViewModel.cs index e0ce4d6..f773fae 100644 --- a/FSI.Lib/FSI.Lib/Guis/SieTiaWinCCMsgMgt/ViewModel/ViewModelWinCC.cs +++ b/FSI.Lib/FSI.Lib/Guis/SieTiaWinCCMsgMgt/ViewModel.cs @@ -1,5 +1,4 @@ -using FSI.Lib.Guis.SieTiaWinCCMsgMgt.Model; -using FSI.Lib.MVVM; +using FSI.Lib.MVVM; using System; using System.ComponentModel; using System.Runtime.InteropServices; @@ -7,9 +6,9 @@ using System.Threading; using System.Threading.Tasks; using System.Windows.Input; -namespace FSI.Lib.Guis.SieTiaWinCCMsgMgt.ViewModel +namespace FSI.Lib.Guis.SieTiaWinCCMsgMgt { - public class ViewModelWinCC : MVVM.ViewModelBase + public class ViewModel : MVVM.ViewModelBase { [DllImport("user32.dll")] public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); @@ -29,7 +28,7 @@ namespace FSI.Lib.Guis.SieTiaWinCCMsgMgt.ViewModel [DllImport("user32.dll")] [return: MarshalAs(UnmanagedType.Bool)] - + static extern bool IsWindowVisible(IntPtr hWnd); const int BM_CLICK = 0x00F5; //message for Click which is a constant @@ -37,43 +36,14 @@ namespace FSI.Lib.Guis.SieTiaWinCCMsgMgt.ViewModel const int WM_LBUTTONUP = 0x0202; // message for Mouse up private CancellationTokenSource tokenSource = null; - private CancellationToken token; private Task task = null; - - private BackgroundWorker backgroundWorker; + private BackgroundWorker backgroundWorker; private ICommand _cmdStart; private ICommand _cmdStop; - private WinCC _winCC; - public ViewModelWinCC() - { - WinCC = new Model.WinCC(); - Init(); - } - - public ViewModelWinCC(bool autoStart, int updateIntervall, string windowsName, string windowsClassName, string buttonName) - { - _winCC = new Model.WinCC - { - AutoStart = autoStart, - UpdateIntervall = updateIntervall, - WindowsName = windowsName, - WindowsClassName = windowsClassName, - ButtonName = buttonName - }; - - //_seletctedWinCC = WinCC; - - Init(); - - if (WinCC.AutoStart) - { - ExecuteStart(null); - } - } - - private void Init() + + public ViewModel() { _cmdStart = new RelayCommand(ExecuteStart, CanExecuteStart); _cmdStop = new RelayCommand(ExecuteStop, CanExecuteStop); @@ -84,22 +54,16 @@ namespace FSI.Lib.Guis.SieTiaWinCCMsgMgt.ViewModel WorkerSupportsCancellation = true }; backgroundWorker.DoWork += BackgroundWorker_DoWork; - backgroundWorker.ProgressChanged += BackgroundWorker_ProgressChanged; + backgroundWorker.ProgressChanged += BackgroundWorker_ProgressChanged; ; } + + public IInterface Data { get; set; } - public Model.WinCC WinCC + public void Init() { - get + if (Data.AutoStart) { - return _winCC; - } - set - { - if (_winCC != value & _winCC != null) - { - _winCC = value; - OnPropertyChanged(); - } + ExecuteStart(null); } } @@ -129,7 +93,6 @@ namespace FSI.Lib.Guis.SieTiaWinCCMsgMgt.ViewModel set => _cmdStop = value; } - private bool CanExecuteStart(object obj) { return !Status; @@ -163,44 +126,23 @@ namespace FSI.Lib.Guis.SieTiaWinCCMsgMgt.ViewModel else { // Perform a time consuming operation and report progress. - Thread.Sleep(WinCC.UpdateIntervall); + Thread.Sleep(Data.UpdateIntervall); // Find windos by Name - var windowHandle = FindWindow(WinCC.WindowsClassName, WinCC.WindowsName); + var windowHandle = FindWindow(Data.WindowsClassName, Data.WindowsName); if (windowHandle != IntPtr.Zero && IsWindowVisible(windowHandle)) { SetForegroundWindow(windowHandle); - var btnHandle = FindWindowEx(windowHandle, IntPtr.Zero, null, WinCC.ButtonName); + var btnHandle = FindWindowEx(windowHandle, IntPtr.Zero, null, Data.ButtonName); SendMessage(btnHandle, BM_CLICK, IntPtr.Zero, IntPtr.Zero); } } } } - public bool Status { get; set; } - private void WinCCMsgMgt() - { - while (true) - { - try - { - if (token.IsCancellationRequested) - { - token.ThrowIfCancellationRequested(); - } - //MessageBox.Show("13456"); - Thread.Sleep(5000); - } - catch (OperationCanceledException) - { - break; - } - } - } - protected virtual void Dispose(bool disposing) { bool disposedValue = false; @@ -229,6 +171,5 @@ namespace FSI.Lib.Guis.SieTiaWinCCMsgMgt.ViewModel task = null; } } - } } diff --git a/FSI.Lib/FSI.Lib/Guis/TxtToClip.Mgt/Model.cs b/FSI.Lib/FSI.Lib/Guis/TxtToClip.Mgt/Model.cs index 92d54ae..bb040cc 100644 --- a/FSI.Lib/FSI.Lib/Guis/TxtToClip.Mgt/Model.cs +++ b/FSI.Lib/FSI.Lib/Guis/TxtToClip.Mgt/Model.cs @@ -1,8 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using System.Collections.Generic; namespace FSI.Lib.Guis.TxtToClip.Mgt { diff --git a/FSI.Lib/FSI.Lib/Guis/TxtToClip.Mgt/ViewModel.cs b/FSI.Lib/FSI.Lib/Guis/TxtToClip.Mgt/ViewModel.cs index a995ae9..cac8e42 100644 --- a/FSI.Lib/FSI.Lib/Guis/TxtToClip.Mgt/ViewModel.cs +++ b/FSI.Lib/FSI.Lib/Guis/TxtToClip.Mgt/ViewModel.cs @@ -143,6 +143,8 @@ namespace FSI.Lib.Guis.TxtToClip.Mgt newDatas.Add(newData); } + + newDatas = new ObservableCollection(newDatas.OrderBy(i => i.DescriptionDtl)); return newDatas; } } diff --git a/FSI.Lib/NLogViewer/ActionCommand.cs b/FSI.Lib/NLogViewer/ActionCommand.cs new file mode 100644 index 0000000..67db679 --- /dev/null +++ b/FSI.Lib/NLogViewer/ActionCommand.cs @@ -0,0 +1,42 @@ +using System; +using System.Windows.Input; + +namespace DJ +{ + public sealed class ActionCommand : ICommand + { + private readonly Action _Action; + private readonly Action _ObjectAction; + + public ActionCommand(Action action) + { + _Action = action; + } + + public ActionCommand(Action objectAction) + { + _ObjectAction = objectAction; + } + + private event EventHandler CanExecuteChanged; + + event EventHandler ICommand.CanExecuteChanged + { + add => CanExecuteChanged += value; + remove => CanExecuteChanged -= value; + } + + bool ICommand.CanExecute(object parameter) + { + return true; + } + + public void Execute(object parameter) + { + if (_ObjectAction != null) + _ObjectAction(parameter); + else + _Action(); + } + } +} \ No newline at end of file diff --git a/FSI.Lib/NLogViewer/Extensions/DependencyObjectExtensions.cs b/FSI.Lib/NLogViewer/Extensions/DependencyObjectExtensions.cs new file mode 100644 index 0000000..8843d89 --- /dev/null +++ b/FSI.Lib/NLogViewer/Extensions/DependencyObjectExtensions.cs @@ -0,0 +1,72 @@ +using System.Collections.Generic; +using System.Windows; +using System.Windows.Media; + +namespace DJ.Extensions +{ + public static class DependencyObjectExtensions + { + /// + /// Analyzes both visual and logical tree in order to find all elements of a given + /// type that are descendants of the item. + /// + /// The type of the queried items. + /// The root element that marks the source of the search. If the + /// source is already of the requested type, it will not be included in the result. + /// The UID of the + /// All descendants of that match the requested type. + public static T FindChildByUid(this DependencyObject source, string uid) where T : UIElement + { + if (source != null) + { + var childs = GetChildObjects(source); + foreach (DependencyObject child in childs) + { + //analyze if children match the requested type + if (child != null && child is T dependencyObject && dependencyObject.Uid.Equals(uid)) + { + return dependencyObject; + } + + var descendant = FindChildByUid(child, uid); + if (descendant != null) + return descendant; + } + } + + return null; + } + + /// + /// This method is an alternative to WPF's + /// method, which also + /// supports content elements. Keep in mind that for content elements, + /// this method falls back to the logical tree of the element. + /// + /// The item to be processed. + /// The submitted item's child elements, if available. + public static IEnumerable GetChildObjects(this DependencyObject parent) + { + if (parent == null) yield break; + + if (parent is ContentElement || parent is FrameworkElement) + { + //use the logical tree for content / framework elements + foreach (object obj in LogicalTreeHelper.GetChildren(parent)) + { + var depObj = obj as DependencyObject; + if (depObj != null) yield return (DependencyObject) obj; + } + } + else + { + //use the visual tree per default + int count = VisualTreeHelper.GetChildrenCount(parent); + for (int i = 0; i < count; i++) + { + yield return VisualTreeHelper.GetChild(parent, i); + } + } + } + } +} diff --git a/FSI.Lib/NLogViewer/Helper/AutoSizedGridView.cs b/FSI.Lib/NLogViewer/Helper/AutoSizedGridView.cs new file mode 100644 index 0000000..ea2459e --- /dev/null +++ b/FSI.Lib/NLogViewer/Helper/AutoSizedGridView.cs @@ -0,0 +1,43 @@ +using System; +using System.Reactive.Linq; +using System.Threading; +using System.Windows.Controls; +using NLog; + +namespace DJ.Helper +{ + /// + /// Represents a view mode that displays data items in columns for a System.Windows.Controls.ListView control with auto sized columns based on the column content + /// Used to fix the column width: https://stackoverflow.com/questions/60147905/column-width-adjustment-is-broken-if-using-multibinding-on-displaymemberbinding + /// + public class AutoSizedGridView : GridView + { + private int _MaxLoggerNameLength; + + protected override void PrepareItem(ListViewItem item) + { + if (item.DataContext is LogEventInfo info) + { + if (info.LoggerName.Length > _MaxLoggerNameLength) + { + _MaxLoggerNameLength = info.LoggerName.Length; + Observable.Timer(TimeSpan.FromMilliseconds(1)).ObserveOn(SynchronizationContext.Current).Subscribe(l => + { + foreach (GridViewColumn column in Columns) + { + //setting NaN for the column width automatically determines the required width enough to hold the content completely. + //if column width was set to NaN already, set it ActualWidth temporarily and set to NaN. This raises the property change event and re computes the width. + if (double.IsNaN(column.Width)) + { + column.Width = column.ActualWidth; + column.Width = double.NaN; + } + } + }); + } + } + + base.PrepareItem(item); + } + } +} diff --git a/FSI.Lib/NLogViewer/Helper/ListViewLayoutManager/ConverterGridViewColumn.cs b/FSI.Lib/NLogViewer/Helper/ListViewLayoutManager/ConverterGridViewColumn.cs new file mode 100644 index 0000000..54febf0 --- /dev/null +++ b/FSI.Lib/NLogViewer/Helper/ListViewLayoutManager/ConverterGridViewColumn.cs @@ -0,0 +1,59 @@ +using System; +using System.Globalization; +using System.Windows.Controls; +using System.Windows.Data; + +namespace DJ.Helper.ListViewLayoutManager +{ + public abstract class ConverterGridViewColumn : GridViewColumn, IValueConverter + { + public Type BindingType => _BindingType; + private readonly Type _BindingType; + + // ############################################################################################################################## + // Constructor + // ############################################################################################################################## + + #region Constructor + + protected ConverterGridViewColumn(Type bindingType) + { + if (bindingType == null) + { + throw new ArgumentNullException(nameof(bindingType)); + } + + this._BindingType = bindingType; + + Binding binding = new Binding {Mode = BindingMode.OneWay, Converter = this}; + DisplayMemberBinding = binding; + } + + #endregion + + // ############################################################################################################################## + // IValueConverter + // ############################################################################################################################## + + #region IValueConverter + + object IValueConverter.Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + if (!_BindingType.IsInstanceOfType(value)) + { + throw new InvalidOperationException(); + } + + return ConvertValue(value); + } + + object IValueConverter.ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } + + protected abstract object ConvertValue(object value); + + #endregion + } +} \ No newline at end of file diff --git a/FSI.Lib/NLogViewer/Helper/ListViewLayoutManager/FixedColumn.cs b/FSI.Lib/NLogViewer/Helper/ListViewLayoutManager/FixedColumn.cs new file mode 100644 index 0000000..5a64ab5 --- /dev/null +++ b/FSI.Lib/NLogViewer/Helper/ListViewLayoutManager/FixedColumn.cs @@ -0,0 +1,61 @@ +using System.Windows; +using System.Windows.Controls; + +namespace DJ.Helper.ListViewLayoutManager +{ + public sealed class FixedColumn : LayoutColumn + { + public static bool IsFixedColumn(GridViewColumn column) + { + if (column == null) + { + return false; + } + + return HasPropertyValue(column, WidthProperty); + } + + public static double? GetFixedWidth(GridViewColumn column) + { + return GetColumnWidth(column, WidthProperty); + } + + public static GridViewColumn ApplyWidth(GridViewColumn gridViewColumn, double width) + { + SetWidth(gridViewColumn, width); + return gridViewColumn; + } + + // ############################################################################################################################## + // AttachedProperties + // ############################################################################################################################## + + #region AttachedProperties + + public static double GetWidth(DependencyObject obj) + { + return (double) obj.GetValue(WidthProperty); + } + + public static void SetWidth(DependencyObject obj, double width) + { + obj.SetValue(WidthProperty, width); + } + + public static readonly DependencyProperty WidthProperty = DependencyProperty.RegisterAttached("Width", typeof(double), typeof(FixedColumn)); + + #endregion + + // ############################################################################################################################## + // Constructor + // ############################################################################################################################## + + #region Constructor + + private FixedColumn() + { + } + + #endregion + } +} \ No newline at end of file diff --git a/FSI.Lib/NLogViewer/Helper/ListViewLayoutManager/ImageGridViewColumn.cs b/FSI.Lib/NLogViewer/Helper/ListViewLayoutManager/ImageGridViewColumn.cs new file mode 100644 index 0000000..cf81e4a --- /dev/null +++ b/FSI.Lib/NLogViewer/Helper/ListViewLayoutManager/ImageGridViewColumn.cs @@ -0,0 +1,58 @@ +using System; +using System.Globalization; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Media; + +namespace DJ.Helper.ListViewLayoutManager +{ + public abstract class ImageGridViewColumn : GridViewColumn, IValueConverter + { + // ############################################################################################################################## + // Constructor + // ############################################################################################################################## + + #region Constructor + + protected ImageGridViewColumn(Stretch imageStretch) + { + FrameworkElementFactory imageElement = new FrameworkElementFactory(typeof(Image)); + + Binding imageSourceBinding = new Binding {Converter = this, Mode = BindingMode.OneWay}; + imageElement.SetBinding(Image.SourceProperty, imageSourceBinding); + + Binding imageStretchBinding = new Binding {Source = imageStretch}; + imageElement.SetBinding(Image.StretchProperty, imageStretchBinding); + + DataTemplate template = new DataTemplate {VisualTree = imageElement}; + CellTemplate = template; + } + + protected ImageGridViewColumn() : this(Stretch.None) + { + } + + #endregion + + // ############################################################################################################################## + // IValueConverter + // ############################################################################################################################## + + #region IValueConverter + + object IValueConverter.Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + return GetImageSource(value); + } + + object IValueConverter.ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } + + protected abstract ImageSource GetImageSource(object value); + + #endregion + } +} \ No newline at end of file diff --git a/FSI.Lib/NLogViewer/Helper/ListViewLayoutManager/LayoutColumn.cs b/FSI.Lib/NLogViewer/Helper/ListViewLayoutManager/LayoutColumn.cs new file mode 100644 index 0000000..d94d28d --- /dev/null +++ b/FSI.Lib/NLogViewer/Helper/ListViewLayoutManager/LayoutColumn.cs @@ -0,0 +1,41 @@ +using System; +using System.Windows; +using System.Windows.Controls; + +namespace DJ.Helper.ListViewLayoutManager +{ + public abstract class LayoutColumn + { + protected static bool HasPropertyValue(GridViewColumn column, DependencyProperty dp) + { + if (column == null) + { + throw new ArgumentNullException(nameof(column)); + } + + object value = column.ReadLocalValue(dp); + if (value?.GetType() == dp.PropertyType) + { + return true; + } + + return false; + } + + protected static double? GetColumnWidth(GridViewColumn column, DependencyProperty dp) + { + if (column == null) + { + throw new ArgumentNullException(nameof(column)); + } + + object value = column.ReadLocalValue(dp); + if (value?.GetType() == dp.PropertyType) + { + return (double) value; + } + + return null; + } + } +} diff --git a/FSI.Lib/NLogViewer/Helper/ListViewLayoutManager/ListViewLayoutManager.cs b/FSI.Lib/NLogViewer/Helper/ListViewLayoutManager/ListViewLayoutManager.cs new file mode 100644 index 0000000..a850ed9 --- /dev/null +++ b/FSI.Lib/NLogViewer/Helper/ListViewLayoutManager/ListViewLayoutManager.cs @@ -0,0 +1,623 @@ +using System; +using System.ComponentModel; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Controls.Primitives; +using System.Windows.Input; +using System.Windows.Media; + +namespace DJ.Helper.ListViewLayoutManager +{ + public class ListViewLayoutManager + { + // ############################################################################################################################## + // Properties + // ############################################################################################################################## + + #region Properties + + // ########################################################################################## + // Public Properties + // ########################################################################################## + + public ListView ListView => _ListView; + + public ScrollBarVisibility VerticalScrollBarVisibility + { + get => _VerticalScrollBarVisibility; + set => _VerticalScrollBarVisibility = value; + } + + // ########################################################################################## + // Private Properties + // ########################################################################################## + + private readonly ListView _ListView; + private ScrollViewer _ScrollViewer; + private bool _Loaded; + private bool _Resizing; + private Cursor _ResizeCursor; + private ScrollBarVisibility _VerticalScrollBarVisibility = ScrollBarVisibility.Auto; + private GridViewColumn _AutoSizedColumn; + + private const double _ZERO_WIDTH_RANGE = 0.1; + + #endregion + + // ############################################################################################################################## + // AttachedProperties + // ############################################################################################################################## + + #region AttachedProperties + + public static void SetEnabled(DependencyObject dependencyObject, bool enabled) + { + dependencyObject.SetValue(EnabledProperty, enabled); + } + + public static readonly DependencyProperty EnabledProperty = DependencyProperty.RegisterAttached("Enabled", + typeof(bool), typeof(ListViewLayoutManager), new FrameworkPropertyMetadata(_OnLayoutManagerEnabledChanged)); + + #endregion + + // ############################################################################################################################## + // Constructor + // ############################################################################################################################## + + #region Constructor + + public ListViewLayoutManager(ListView listView) + { + _ListView = listView ?? throw new ArgumentNullException(nameof(listView)); + _ListView.Loaded += ListView_Loaded; + _ListView.Unloaded += ListView_Unloaded; + } + + private void ListView_Loaded(object sender, RoutedEventArgs e) + { + _RegisterEvents(_ListView); + _InitColumns(); + _DoResizeColumns(); + _Loaded = true; + } + + + private void ListView_Unloaded(object sender, RoutedEventArgs e) + { + if (!_Loaded) + { + return; + } + + _UnRegisterEvents(_ListView); + _Loaded = false; + } + + #endregion + + // ############################################################################################################################## + // public methods + // ############################################################################################################################## + + #region public methods + + public void Refresh() + { + _InitColumns(); + _DoResizeColumns(); + } + + protected virtual void ResizeColumns() + { + GridView view = _ListView.View as GridView; + if (view == null || view.Columns.Count == 0) + { + return; + } + + // listview width + double actualWidth = double.PositiveInfinity; + if (_ScrollViewer != null) + { + actualWidth = _ScrollViewer.ViewportWidth; + } + + if (double.IsInfinity(actualWidth)) + { + actualWidth = _ListView.ActualWidth; + } + + if (double.IsInfinity(actualWidth) || actualWidth <= 0) + { + return; + } + + double resizeableRegionCount = 0; + double otherColumnsWidth = 0; + // determine column sizes + foreach (GridViewColumn gridViewColumn in view.Columns) + { + if (ProportionalColumn.IsProportionalColumn(gridViewColumn)) + { + double? proportionalWidth = ProportionalColumn.GetProportionalWidth(gridViewColumn); + if (proportionalWidth != null) + { + resizeableRegionCount += proportionalWidth.Value; + } + } + else + { + otherColumnsWidth += gridViewColumn.ActualWidth; + } + } + + if (resizeableRegionCount <= 0) + { + // no proportional columns present: commit the regulation to the scroll viewer + if (_ScrollViewer != null) + { + _ScrollViewer.HorizontalScrollBarVisibility = ScrollBarVisibility.Auto; + } + + // search the first fill column + GridViewColumn fillColumn = null; + for (int i = 0; i < view.Columns.Count; i++) + { + GridViewColumn gridViewColumn = view.Columns[i]; + if (_IsFillColumn(gridViewColumn)) + { + fillColumn = gridViewColumn; + break; + } + } + + if (fillColumn != null) + { + double otherColumnsWithoutFillWidth = otherColumnsWidth - fillColumn.ActualWidth; + double fillWidth = actualWidth - otherColumnsWithoutFillWidth; + if (fillWidth > 0) + { + double? minWidth = RangeColumn.GetRangeMinWidth(fillColumn); + double? maxWidth = RangeColumn.GetRangeMaxWidth(fillColumn); + + bool setWidth = !(minWidth.HasValue && fillWidth < minWidth.Value); + if (maxWidth.HasValue && fillWidth > maxWidth.Value) + { + setWidth = false; + } + + if (setWidth) + { + if (_ScrollViewer != null) + { + _ScrollViewer.HorizontalScrollBarVisibility = ScrollBarVisibility.Hidden; + } + + fillColumn.Width = fillWidth; + } + } + } + + return; + } + + double resizeableColumnsWidth = actualWidth - otherColumnsWidth; + if (resizeableColumnsWidth <= 0) + { + return; // missing space + } + + // resize columns + double resizeableRegionWidth = resizeableColumnsWidth / resizeableRegionCount; + foreach (GridViewColumn gridViewColumn in view.Columns) + { + if (ProportionalColumn.IsProportionalColumn(gridViewColumn)) + { + double? proportionalWidth = ProportionalColumn.GetProportionalWidth(gridViewColumn); + if (proportionalWidth != null) + { + gridViewColumn.Width = proportionalWidth.Value * resizeableRegionWidth; + } + } + } + } + + #endregion + + // ############################################################################################################################## + // private methods + // ############################################################################################################################## + + #region private methods + + private void _DoResizeColumns() + { + if (_Resizing) + { + return; + } + + _Resizing = true; + try + { + ResizeColumns(); + } + finally + { + _Resizing = false; + } + } + + private void _RegisterEvents(DependencyObject start) + { + for (int i = 0; i < VisualTreeHelper.GetChildrenCount(start); i++) + { + Visual childVisual = VisualTreeHelper.GetChild(start, i) as Visual; + if (childVisual is Thumb) + { + GridViewColumn gridViewColumn = _FindParentColumn(childVisual); + if (gridViewColumn != null) + { + Thumb thumb = childVisual as Thumb; + if (ProportionalColumn.IsProportionalColumn(gridViewColumn) || + FixedColumn.IsFixedColumn(gridViewColumn) || _IsFillColumn(gridViewColumn)) + { + thumb.IsHitTestVisible = false; + } + else + { + thumb.PreviewMouseMove += _ThumbPreviewMouseMove; + thumb.PreviewMouseLeftButtonDown += + _ThumbPreviewMouseLeftButtonDown; + DependencyPropertyDescriptor.FromProperty( + GridViewColumn.WidthProperty, + typeof(GridViewColumn)).AddValueChanged(gridViewColumn, _GridColumnWidthChanged); + } + } + } + else if (childVisual is GridViewColumnHeader) + { + GridViewColumnHeader columnHeader = childVisual as GridViewColumnHeader; + columnHeader.SizeChanged += _GridColumnHeaderSizeChanged; + } + else if (_ScrollViewer == null && childVisual is ScrollViewer) + { + _ScrollViewer = childVisual as ScrollViewer; + _ScrollViewer.ScrollChanged += _ScrollViewerScrollChanged; + // assume we do the regulation of the horizontal scrollbar + _ScrollViewer.HorizontalScrollBarVisibility = ScrollBarVisibility.Hidden; + _ScrollViewer.VerticalScrollBarVisibility = _VerticalScrollBarVisibility; + } + + _RegisterEvents(childVisual); + } + } + + private void _UnRegisterEvents(DependencyObject start) + { + for (int i = 0; i < VisualTreeHelper.GetChildrenCount(start); i++) + { + Visual childVisual = VisualTreeHelper.GetChild(start, i) as Visual; + if (childVisual is Thumb) + { + GridViewColumn gridViewColumn = _FindParentColumn(childVisual); + if (gridViewColumn != null) + { + Thumb thumb = childVisual as Thumb; + if (ProportionalColumn.IsProportionalColumn(gridViewColumn) || + FixedColumn.IsFixedColumn(gridViewColumn) || _IsFillColumn(gridViewColumn)) + { + thumb.IsHitTestVisible = true; + } + else + { + thumb.PreviewMouseMove -= _ThumbPreviewMouseMove; + thumb.PreviewMouseLeftButtonDown -= + _ThumbPreviewMouseLeftButtonDown; + DependencyPropertyDescriptor.FromProperty( + GridViewColumn.WidthProperty, + typeof(GridViewColumn)).RemoveValueChanged(gridViewColumn, _GridColumnWidthChanged); + } + } + } + else if (childVisual is GridViewColumnHeader) + { + GridViewColumnHeader columnHeader = childVisual as GridViewColumnHeader; + columnHeader.SizeChanged -= _GridColumnHeaderSizeChanged; + } + else if (_ScrollViewer == null && childVisual is ScrollViewer) + { + _ScrollViewer = childVisual as ScrollViewer; + _ScrollViewer.ScrollChanged -= _ScrollViewerScrollChanged; + } + + _UnRegisterEvents(childVisual); + } + } + + private GridViewColumn _FindParentColumn(DependencyObject element) + { + if (element == null) + { + return null; + } + + while (element != null) + { + GridViewColumnHeader gridViewColumnHeader = element as GridViewColumnHeader; + if (gridViewColumnHeader != null) + { + return (gridViewColumnHeader).Column; + } + + element = VisualTreeHelper.GetParent(element); + } + + return null; + } + + private GridViewColumnHeader _FindColumnHeader(DependencyObject start, GridViewColumn gridViewColumn) + { + for (int i = 0; i < VisualTreeHelper.GetChildrenCount(start); i++) + { + Visual childVisual = VisualTreeHelper.GetChild(start, i) as Visual; + if (childVisual is GridViewColumnHeader) + { + GridViewColumnHeader gridViewHeader = childVisual as GridViewColumnHeader; + if (gridViewHeader.Column == gridViewColumn) + { + return gridViewHeader; + } + } + + GridViewColumnHeader childGridViewHeader = _FindColumnHeader(childVisual, gridViewColumn); + if (childGridViewHeader != null) + { + return childGridViewHeader; + } + } + + return null; + } + + private void _InitColumns() + { + GridView view = _ListView.View as GridView; + if (view == null) + { + return; + } + + foreach (GridViewColumn gridViewColumn in view.Columns) + { + if (!RangeColumn.IsRangeColumn(gridViewColumn)) + { + continue; + } + + double? minWidth = RangeColumn.GetRangeMinWidth(gridViewColumn); + double? maxWidth = RangeColumn.GetRangeMaxWidth(gridViewColumn); + if (!minWidth.HasValue && !maxWidth.HasValue) + { + continue; + } + + GridViewColumnHeader columnHeader = _FindColumnHeader(_ListView, gridViewColumn); + if (columnHeader == null) + { + continue; + } + + double actualWidth = columnHeader.ActualWidth; + if (minWidth.HasValue) + { + columnHeader.MinWidth = minWidth.Value; + if (!double.IsInfinity(actualWidth) && actualWidth < columnHeader.MinWidth) + { + gridViewColumn.Width = columnHeader.MinWidth; + } + } + + if (maxWidth.HasValue) + { + columnHeader.MaxWidth = maxWidth.Value; + if (!double.IsInfinity(actualWidth) && actualWidth > columnHeader.MaxWidth) + { + gridViewColumn.Width = columnHeader.MaxWidth; + } + } + } + } + + // returns the delta + private double _SetRangeColumnToBounds(GridViewColumn gridViewColumn) + { + double startWidth = gridViewColumn.Width; + + double? minWidth = RangeColumn.GetRangeMinWidth(gridViewColumn); + double? maxWidth = RangeColumn.GetRangeMaxWidth(gridViewColumn); + + if ((minWidth.HasValue && maxWidth.HasValue) && (minWidth > maxWidth)) + { + return 0; // invalid case + } + + if (minWidth.HasValue && gridViewColumn.Width < minWidth.Value) + { + gridViewColumn.Width = minWidth.Value; + } + else if (maxWidth.HasValue && gridViewColumn.Width > maxWidth.Value) + { + gridViewColumn.Width = maxWidth.Value; + } + + return gridViewColumn.Width - startWidth; + } + + private bool _IsFillColumn(GridViewColumn gridViewColumn) + { + if (gridViewColumn == null) + { + return false; + } + + GridView view = _ListView.View as GridView; + if (view == null || view.Columns.Count == 0) + { + return false; + } + + bool? isFillColumn = RangeColumn.GetRangeIsFillColumn(gridViewColumn); + return isFillColumn.HasValue && isFillColumn.Value; + } + + private void _ThumbPreviewMouseMove(object sender, MouseEventArgs e) + { + Thumb thumb = sender as Thumb; + if (thumb == null) + { + return; + } + + GridViewColumn gridViewColumn = _FindParentColumn(thumb); + if (gridViewColumn == null) + { + return; + } + + // suppress column resizing for proportional, fixed and range fill columns + if (ProportionalColumn.IsProportionalColumn(gridViewColumn) || + FixedColumn.IsFixedColumn(gridViewColumn) || + _IsFillColumn(gridViewColumn)) + { + thumb.Cursor = null; + return; + } + + // check range column bounds + if (thumb.IsMouseCaptured && RangeColumn.IsRangeColumn(gridViewColumn)) + { + double? minWidth = RangeColumn.GetRangeMinWidth(gridViewColumn); + double? maxWidth = RangeColumn.GetRangeMaxWidth(gridViewColumn); + + if ((minWidth.HasValue && maxWidth.HasValue) && (minWidth > maxWidth)) + { + return; // invalid case + } + + if (_ResizeCursor == null) + { + _ResizeCursor = thumb.Cursor; // save the resize cursor + } + + if (minWidth.HasValue && gridViewColumn.Width <= minWidth.Value) + { + thumb.Cursor = Cursors.No; + } + else if (maxWidth.HasValue && gridViewColumn.Width >= maxWidth.Value) + { + thumb.Cursor = Cursors.No; + } + else + { + thumb.Cursor = _ResizeCursor; // between valid min/max + } + } + } + + private void _ThumbPreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) + { + Thumb thumb = sender as Thumb; + GridViewColumn gridViewColumn = _FindParentColumn(thumb); + + // suppress column resizing for proportional, fixed and range fill columns + if (ProportionalColumn.IsProportionalColumn(gridViewColumn) || + FixedColumn.IsFixedColumn(gridViewColumn) || + _IsFillColumn(gridViewColumn)) + { + e.Handled = true; + } + } + + private void _GridColumnWidthChanged(object sender, EventArgs e) + { + if (!_Loaded) + { + return; + } + + GridViewColumn gridViewColumn = sender as GridViewColumn; + + // suppress column resizing for proportional and fixed columns + if (ProportionalColumn.IsProportionalColumn(gridViewColumn) || FixedColumn.IsFixedColumn(gridViewColumn)) + { + return; + } + + // ensure range column within the bounds + if (RangeColumn.IsRangeColumn(gridViewColumn)) + { + // special case: auto column width - maybe conflicts with min/max range + if (gridViewColumn != null && gridViewColumn.Width.Equals(double.NaN)) + { + _AutoSizedColumn = gridViewColumn; + return; // handled by the change header size event + } + + // ensure column bounds + if (Math.Abs(_SetRangeColumnToBounds(gridViewColumn) - 0) > _ZERO_WIDTH_RANGE) + { + return; + } + } + + _DoResizeColumns(); + } + + // handle autosized column + private void _GridColumnHeaderSizeChanged(object sender, SizeChangedEventArgs e) + { + if (_AutoSizedColumn == null) + { + return; + } + + GridViewColumnHeader gridViewColumnHeader = sender as GridViewColumnHeader; + if (gridViewColumnHeader != null && gridViewColumnHeader.Column == _AutoSizedColumn) + { + if (gridViewColumnHeader.Width.Equals(double.NaN)) + { + // sync column with + gridViewColumnHeader.Column.Width = gridViewColumnHeader.ActualWidth; + _DoResizeColumns(); + } + + _AutoSizedColumn = null; + } + } + + private void _ScrollViewerScrollChanged(object sender, ScrollChangedEventArgs e) + { + if (_Loaded && Math.Abs(e.ViewportWidthChange - 0) > _ZERO_WIDTH_RANGE) + { + _DoResizeColumns(); + } + } + + private static void _OnLayoutManagerEnabledChanged(DependencyObject dependencyObject, + DependencyPropertyChangedEventArgs e) + { + ListView listView = dependencyObject as ListView; + if (listView != null) + { + bool enabled = (bool) e.NewValue; + if (enabled) + { + new ListViewLayoutManager(listView); + } + } + } + + #endregion + } +} \ No newline at end of file diff --git a/FSI.Lib/NLogViewer/Helper/ListViewLayoutManager/ProportionalColumn.cs b/FSI.Lib/NLogViewer/Helper/ListViewLayoutManager/ProportionalColumn.cs new file mode 100644 index 0000000..f43fea7 --- /dev/null +++ b/FSI.Lib/NLogViewer/Helper/ListViewLayoutManager/ProportionalColumn.cs @@ -0,0 +1,61 @@ +using System.Windows; +using System.Windows.Controls; + +namespace DJ.Helper.ListViewLayoutManager +{ + public sealed class ProportionalColumn : LayoutColumn + { + public static bool IsProportionalColumn(GridViewColumn column) + { + if (column == null) + { + return false; + } + + return HasPropertyValue(column, WidthProperty); + } + + public static double? GetProportionalWidth(GridViewColumn column) + { + return GetColumnWidth(column, WidthProperty); + } + + public static GridViewColumn ApplyWidth(GridViewColumn gridViewColumn, double width) + { + SetWidth(gridViewColumn, width); + return gridViewColumn; + } + + // ############################################################################################################################## + // AttachedProperties + // ############################################################################################################################## + + #region AttachedProperties + + public static double GetWidth(DependencyObject obj) + { + return (double) obj.GetValue(WidthProperty); + } + + public static void SetWidth(DependencyObject obj, double width) + { + obj.SetValue(WidthProperty, width); + } + + public static readonly DependencyProperty WidthProperty = DependencyProperty.RegisterAttached("Width", typeof(double), typeof(ProportionalColumn)); + + #endregion + + // ############################################################################################################################## + // Constructor + // ############################################################################################################################## + + #region Constructor + + private ProportionalColumn() + { + } + + #endregion + } +} \ No newline at end of file diff --git a/FSI.Lib/NLogViewer/Helper/ListViewLayoutManager/RangeColumn.cs b/FSI.Lib/NLogViewer/Helper/ListViewLayoutManager/RangeColumn.cs new file mode 100644 index 0000000..66df102 --- /dev/null +++ b/FSI.Lib/NLogViewer/Helper/ListViewLayoutManager/RangeColumn.cs @@ -0,0 +1,136 @@ +using System; +using System.Windows; +using System.Windows.Controls; + +namespace DJ.Helper.ListViewLayoutManager +{ + + + public sealed class RangeColumn : LayoutColumn + { + + + public static readonly DependencyProperty MinWidthProperty = + DependencyProperty.RegisterAttached( + "MinWidth", + typeof( double ), + typeof( RangeColumn ) ); + + + public static readonly DependencyProperty MaxWidthProperty = + DependencyProperty.RegisterAttached( + "MaxWidth", + typeof( double ), + typeof( RangeColumn ) ); + + + public static readonly DependencyProperty IsFillColumnProperty = + DependencyProperty.RegisterAttached( + "IsFillColumn", + typeof( bool ), + typeof( RangeColumn ) ); + + + private RangeColumn() + { + } // RangeColumn + + + public static double GetMinWidth( DependencyObject obj ) + { + return (double)obj.GetValue( MinWidthProperty ); + } // GetMinWidth + + + public static void SetMinWidth( DependencyObject obj, double minWidth ) + { + obj.SetValue( MinWidthProperty, minWidth ); + } // SetMinWidth + + + public static double GetMaxWidth( DependencyObject obj ) + { + return (double)obj.GetValue( MaxWidthProperty ); + } // GetMaxWidth + + + public static void SetMaxWidth( DependencyObject obj, double maxWidth ) + { + obj.SetValue( MaxWidthProperty, maxWidth ); + } // SetMaxWidth + + + public static bool GetIsFillColumn( DependencyObject obj ) + { + return (bool)obj.GetValue( IsFillColumnProperty ); + } // GetIsFillColumn + + + public static void SetIsFillColumn( DependencyObject obj, bool isFillColumn ) + { + obj.SetValue( IsFillColumnProperty, isFillColumn ); + } // SetIsFillColumn + + + public static bool IsRangeColumn( GridViewColumn column ) + { + if ( column == null ) + { + return false; + } + return + HasPropertyValue( column, MinWidthProperty ) || + HasPropertyValue( column, MaxWidthProperty ) || + HasPropertyValue( column, IsFillColumnProperty ); + } // IsRangeColumn + + + public static double? GetRangeMinWidth( GridViewColumn column ) + { + return GetColumnWidth( column, MinWidthProperty ); + } // GetRangeMinWidth + + + public static double? GetRangeMaxWidth( GridViewColumn column ) + { + return GetColumnWidth( column, MaxWidthProperty ); + } // GetRangeMaxWidth + + + public static bool? GetRangeIsFillColumn( GridViewColumn column ) + { + if ( column == null ) + { + throw new ArgumentNullException( nameof(column) ); + } + object value = column.ReadLocalValue( IsFillColumnProperty ); + if ( value != null && value.GetType() == IsFillColumnProperty.PropertyType ) + { + return (bool)value; + } + + return null; + } // GetRangeIsFillColumn + + + public static GridViewColumn ApplyWidth( GridViewColumn gridViewColumn, double minWidth, + double width, double maxWidth ) + { + return ApplyWidth( gridViewColumn, minWidth, width, maxWidth, false ); + } // ApplyWidth + + + public static GridViewColumn ApplyWidth( GridViewColumn gridViewColumn, double minWidth, + double width, double maxWidth, bool isFillColumn ) + { + SetMinWidth( gridViewColumn, minWidth ); + gridViewColumn.Width = width; + SetMaxWidth( gridViewColumn, maxWidth ); + SetIsFillColumn( gridViewColumn, isFillColumn ); + return gridViewColumn; + } // ApplyWidth + + } // class RangeColumn + +} // namespace Itenso.Windows.Controls.ListViewLayout +// -- EOF ------------------------------------------------------------------- diff --git a/FSI.Lib/NLogViewer/Helper/PredicateBuilder.cs b/FSI.Lib/NLogViewer/Helper/PredicateBuilder.cs new file mode 100644 index 0000000..b69f93d --- /dev/null +++ b/FSI.Lib/NLogViewer/Helper/PredicateBuilder.cs @@ -0,0 +1,28 @@ +using System; +using System.Linq; +using System.Linq.Expressions; + +namespace DJ.Helper +{ + public static class PredicateBuilder + { + public static Expression> True () { return f => true; } + public static Expression> False () { return f => false; } + + public static Expression> Or (this Expression> expr1, + Expression> expr2) + { + var invokedExpr = Expression.Invoke (expr2, expr1.Parameters.Cast ()); + return Expression.Lambda> + (Expression.OrElse (expr1.Body, invokedExpr), expr1.Parameters); + } + + public static Expression> And (this Expression> expr1, + Expression> expr2) + { + var invokedExpr = Expression.Invoke (expr2, expr1.Parameters.Cast ()); + return Expression.Lambda> + (Expression.AndAlso (expr1.Body, invokedExpr), expr1.Parameters); + } + } +} diff --git a/FSI.Lib/NLogViewer/Images/Glyphs/SortDownArrow.png b/FSI.Lib/NLogViewer/Images/Glyphs/SortDownArrow.png new file mode 100644 index 0000000000000000000000000000000000000000..7e5a1a581bb500878cb6b24fed7382b0e54cb89f GIT binary patch literal 264 zcmeAS@N?(olHy`uVBq!ia0vp^JV4CJ!3HGRcAO0XQjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`6_P!Id>I(3)EF2VS{N990fib~Fff!FFfhDIU|_JC!N4G1FlSew4NyY7 z#5JNMI6tkVJh3R1As{g`uSCz!HAJDzSkH8?>*A9@CCQ#Hjv*Ss$q5U%Goor9*c(c` zlbGFD$X;ir;zxShj ziV{cj4GU4_>{~UDuGI^ut&oTmzS!kB%VD1LM}?pmMux6yoiCESUV*G*@O1TaS?83{ F1OU^4TV4PF literal 0 HcmV?d00001 diff --git a/FSI.Lib/NLogViewer/Images/Glyphs/SortUpArrow.png b/FSI.Lib/NLogViewer/Images/Glyphs/SortUpArrow.png new file mode 100644 index 0000000000000000000000000000000000000000..3c0cae48df463b294a40a90426f97518cd9a93d3 GIT binary patch literal 278 zcmeAS@N?(olHy`uVBq!ia0vp^JV4CJ!3HGRcAO0XQjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`6_P!Id>I(3)EF2VS{N990fib~Fff!FFfhDIU|_JC!N4G1FlSew4NyY7 z#5JNMI6tkVJh3R1As{g`uSCz!HAJDzSkH8?>*A9@C54_Yjv*Ss$q5VCGNNi8*mDS{ zig`SICcOQ?j0I{Fn!dW{|Ed4{Q(U6?hJ|UP$~BpN|Ng%_z5f4t``@I2UpN2& literal 0 HcmV?d00001 diff --git a/FSI.Lib/NLogViewer/Images/Large/Add.png b/FSI.Lib/NLogViewer/Images/Large/Add.png new file mode 100644 index 0000000000000000000000000000000000000000..98598c86115ed4c1f364c566d01190fe7b944f57 GIT binary patch literal 2835 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 literal 0 HcmV?d00001 diff --git a/FSI.Lib/NLogViewer/Images/Large/Context.png b/FSI.Lib/NLogViewer/Images/Large/Context.png new file mode 100644 index 0000000000000000000000000000000000000000..0c68107b3f58aa8762b39680968b8c8347543f57 GIT binary patch literal 1566 zcmV+(2I2XMP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^XO*0N*(00oXoL_t(|UhSJ#h$K}MK*y{YK*5MPfH~ra z0St&@KxGvJ=!Xg_CQvb8`Vqw(z<`PYL{Pzm`k{WPKOzQDQOpU&oIpV_pVRIeYRg+y zuR{0I!yGuU-CcLO@7?Ko@7}7J3D^`rz{^LE<_4SNNw~!5Q4J>l8UC}-D{d>6rq@WGAu$>^2uo|LX>=Rks>rDpPZ&5)Fq#sEy9NjpUAOG5!S#%{`==d z$VonV4UW$C(Ti2KEyAt%C$2bpl*f|zCLTR{luw)F^?e*+Qqcib<`!X9`~{71DavIX zH0E_|T)Gz0Hu+C*Bb?`;V>*7cOB+(5vDlLADdvr;K?V3D8lntJmw+H#F9_6Ey6AMYw0=t8&}6B zmdD?*9RDtEjT22i(Y6Rx?u1RaHIHI7?J05`EcwLM7`;&&kH9AO#VEFogD0QpTZD75 zi4!r3&2?HaW566Lxvg2dQ(m`>Np;jAHAY zX!1Lt>wL7-HEGN;SjRUQ#n$;SZi!>V#%2LNhpy+*hsbpUtitxW>(BoSpT+}lDI5ep zkS*;;7`k*ew@D>)SZ z!03ne^-`?jOpIdsYD?XEF6j)aKeU%v0T(MS zb)N0_M8EU?+WS9m^0#9Z{&uA#ZG7IrC(-lKS?H9>6Xj}{+geW*uI0Pqy6Dn7&ph+Y zGbeCw?&YpsajZ?t;=(1#zF}K*JL`__CUjkY8;e_NulGejpIk|Co@iN-N=I#t#*CV_H79Fp@p_lQW!8`CgJPLP4`xdVz56W72A$o|dUAF(+6^a$ zYqKju^nvQMf3L%RKonP}^MJvZ!8*DouMc7!Zi1q?Chx?F6roS@>g1*lcYsk`j$ddYV_x@2_8wW2!+vMwRV%QAp@V%nAwhmT=w#k2u+n~eD z@@p+#O+Ilg7LW4^O%7f+D8_l$czO3YwjvCbyljlcmil7M z!C^=7JsiG73|@pGlTSQ~>G)%PA_FHqDdu~u`#XcdiZG7kWiL!I4n%Ws%#~uC6E@Mi z2;)j#{O&pgHO{GU4$k;I-pljr`$Pu4iqK}z(I)wXfA;bg=H9kq(Of~A8mBUCi{Nl| zbaE}9t*h*kd{_3zE@P}VMey?aXk%s-nkKT7OujEUMQ||V-EOm31pkgMI(V9rPt+CR zf5|7JB1~iQiKqyb$tQ|MnC9dY#Uhw|)kJy`EW*j?Rh7BG`S>{o$h($07*qoM6N<$f(keNssI20 literal 0 HcmV?d00001 diff --git a/FSI.Lib/NLogViewer/Images/Large/Debug.png b/FSI.Lib/NLogViewer/Images/Large/Debug.png new file mode 100644 index 0000000000000000000000000000000000000000..8b898fb9076b958ad9c20c014608c39eb21434cf GIT binary patch literal 4039 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 literal 0 HcmV?d00001 diff --git a/FSI.Lib/NLogViewer/Images/Large/DebugSource.png b/FSI.Lib/NLogViewer/Images/Large/DebugSource.png new file mode 100644 index 0000000000000000000000000000000000000000..dba0007ff68efce335f0af58a96c0575d0b9e2fd GIT binary patch literal 984 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 literal 0 HcmV?d00001 diff --git a/FSI.Lib/NLogViewer/Images/Large/Exit.png b/FSI.Lib/NLogViewer/Images/Large/Exit.png new file mode 100644 index 0000000000000000000000000000000000000000..d8c9a13d3d3565e99643b059b3241d00b3b23c1c GIT binary patch literal 6769 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 TmjCE!00000NkvXXu0mjf(~9v; literal 0 HcmV?d00001 diff --git a/FSI.Lib/NLogViewer/Images/Large/Export.png b/FSI.Lib/NLogViewer/Images/Large/Export.png new file mode 100644 index 0000000000000000000000000000000000000000..dcd779d16946af56d5ea99ec24008dd5653e4adb GIT binary patch literal 4049 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 DKIo*u literal 0 HcmV?d00001 diff --git a/FSI.Lib/NLogViewer/Images/Large/Fatal.png b/FSI.Lib/NLogViewer/Images/Large/Fatal.png new file mode 100644 index 0000000000000000000000000000000000000000..6ffb187235d59ae5510a5bc05a5945917a936b9f GIT binary patch literal 5691 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 literal 0 HcmV?d00001 diff --git a/FSI.Lib/NLogViewer/Images/Large/Save.png b/FSI.Lib/NLogViewer/Images/Large/Save.png new file mode 100644 index 0000000000000000000000000000000000000000..b260fb9f51b766119525dcf8a5890e591d2fd7e8 GIT binary patch literal 2986 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 literal 0 HcmV?d00001 diff --git a/FSI.Lib/NLogViewer/Images/Large/Settings.png b/FSI.Lib/NLogViewer/Images/Large/Settings.png new file mode 100644 index 0000000000000000000000000000000000000000..080ea12bf35c0ef9a45f2ea2ee24d3c1b189857c GIT binary patch literal 7121 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 O0H7qNCR-_O8uCA^iGOJT literal 0 HcmV?d00001 diff --git a/FSI.Lib/NLogViewer/Images/Large/Thread.png b/FSI.Lib/NLogViewer/Images/Large/Thread.png new file mode 100644 index 0000000000000000000000000000000000000000..f799e889834b1b4e5b9dd1d999bd5485287bbe3f GIT binary patch literal 10896 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 P00000NkvXXu0mjf(#(KM literal 0 HcmV?d00001 diff --git a/FSI.Lib/NLogViewer/Images/Large/Unknown.png b/FSI.Lib/NLogViewer/Images/Large/Unknown.png new file mode 100644 index 0000000000000000000000000000000000000000..b1378bdb1a5d431e242adbdeea3cd40f4e6691e3 GIT binary patch literal 2165 zcmV-*2#WWKP)vjNgW zHd863j55k7r-U#Nqm$D#bCxE~ah`7C{x=Nxrp)Co7O;R>6p>FDBY`4Hgl^7ph#bO%1!CkaZm3Dw5_iOf#=gL+DnRhj@@WB55;M zPcxgCK2{S<<0;lM&Fz&*4q>t|2@ogB0R0RgZlqD_*}{GX(i0#+4bSrcnNG$9lv7DL zB@~cDCIMm$(n|-;d`=_hxRJP92V40Am;I|ggRgVMsm^?5u_&!-zzrNp{K8 zGE*{~rs(5!%KWomN2`5<@v>6hk#>noY7EK|`Gr)8X%}IHz0C5%K9lua(w7G1UU^fx zeX!QGaYCMzX?79f>`yI%$r>)|%O=PMIqmDqofwdPQft>kjK5KtT!4pY(b<>EHi?XZ zxrHYAu4LP_u$!sg?B~&-v!5+>61@fXA|jXN$C9UuFvJ$dyR$FkkHi(}EZILM)jJW9 zUrD|$!gao51iuILjVVTQ~Gm0B@(M}t!v~hthBE$)KP-ilq01ZT~i4Zer zpnY_p0?{JgP(gDlzvWSv4F_oF1V=f+d9Kk%6ag~Hqlh^yW&uU6vF$pW`8|WyFwQ$X z!&RMP0&gkx=gLbmn4robsguWLmW-32Yupb=p47^Ax#DVwOY(>WbTh27i}(mV)=NXy zN{`DHowD4=^^+%0${AM?8f3Okd4S3K_wP}!=Ez~!4LYRO*9{nuZ%Vt%`j~8!TtydQ zowC-$bXhO5|93dBOF*=$4f_-Chd70K%-`HcOTo9@UP9Hv*VslHuxdQQqRX z%X|S(P@skjnFl6tC-+46JyQfBhRIyM#&RmiyE)&*E`G@+8*PkZM4ib5Fp-t~-O5c2?qjM+77MMs z&0rbDo?o8H0v_aBlsZgQ$a>oOwIdhrV!%ZJSi}sDS%c|R8cb%6(#et}_Rr^eo~6u% zB7H$)d{BnWyMSaf+dgn!}xGRBAe!d0X9e z08~=rNj-tv)nL3qh4nj|Nn>JvfuHkl+f0aWsFR(59Gy?dRFqldq|JPUL%c*C!`fVc z<*Z3kL}utGCTJ?I8LsEn8-tvtjvbt`9k>AZ@iX^w%HnA`9e`o#OZ|F)(8`A#8l(tk)AAlbAJ*`77vwDBIYYP=Xnhv5vLLlHUJ`uRE+sr=_o`N|{n_(c@qr zq?CtQ#XQWEt4H*;F_Tl40R3F|DFBXaF~Dk`VU}*&BpBq18VnmWSw7TnC8}v7$Wrd{ z$sQtfsX?DXi)E5QntXeK9YQP(>Mp%b?>1;6Vr|n%-W~)Vr}PBUnRUjCAHdj8+wMF0@wLer7jT;Lx2~ES()m$rPo)z z*Du#>&yep*@dGJRd2u82O@xo>v9jWiIKmwbJ54{ZZMZ zx35m9Zb`Z7i3Mb}Yh|copS|lL$lY?vhX9|*482|R8$wo0ZDzL>gM`1ZD@D6IkdT}P zeZ+z*yvi9hY~xQ1Spvk^#ZhJ9m-%E&E|v@Q`4%mAG5jI%≀u_ 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 QCIA2c07*qoM6N<$g1$?o5dZ)H literal 0 HcmV?d00001 diff --git a/FSI.Lib/NLogViewer/Images/Medium/Add.png b/FSI.Lib/NLogViewer/Images/Medium/Add.png new file mode 100644 index 0000000000000000000000000000000000000000..a8c521d34e9b0fcf4fb9892ae8c84d87121afd2a GIT binary patch literal 1443 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 M07*qoM6N<$f;V4o;Q#;t literal 0 HcmV?d00001 diff --git a/FSI.Lib/NLogViewer/Images/Medium/Exception.png b/FSI.Lib/NLogViewer/Images/Medium/Exception.png new file mode 100644 index 0000000000000000000000000000000000000000..341ed5d2d704062ae4a09e319740f83dfe83f699 GIT binary patch literal 2462 zcmZ`*XHb*d7X2vFQKATl5io=j6ikpNND%`hk)jysT~JE6^d@jYu0j9-2|_40fOs)R zO^_16LSRG$q@#o;29VxDZ&7%;@8A3J=FC28=FHi9_N+Z?os)Xq+Cp4JRs;Y5aWo2P z%SDBMLr8$Thuyok$przgYZgf0@ZVM1K+fTw2nVAa!?=k0ZKt^vr zUQ&pWOgssWFoRxzEJCWFkXMkZYyHxo4|_93#@`eB`fl*c)$+*LVjAW+2S-{%Mgm8z z^E#&SvoZX@S1qM%)Hg!A_a&)x>bdeeJeFx~HFzA*%Svgh6N{cDMSaW?hYF$@3o$=L zM@L5k&z(ER92t=feG3M+-e<}}c*`Zr`c(Vpweo>5b!m2EgNr)3}S{%kjdU$%Ct*xnf;8m&W6u>L75~c_-1%asAbS7^i1uN3f&=5US zaQE-LygWyMo!-W(VIFCQuYNuq^o^~>_={~$Na%HH%x(AXwz08s=63U9z#or_*UVZU|w|)O2pqKeqMus>Jhs#ezmZ_7hcVOi>!ZqlQxw$zUfmoyS3|6=s3vo_T zx17_{)9*eflQZIsj&bRzcX?t9g+XDQSDC2Y_E|i zk?9U1!pP|83801vl%kIEMjPg|Z}xO{zQC08c2q6M@r~akk$YJzi`L<*Ewzpm>Py29p3h{AOw@Fa3}*tf&Nsxzk2p+&%wqRDysX0@WUWd1EwAh=N-30rWYB#d zGr!T3mexO}K7C42&BaXg!KufVCpc*>kUSz$owXx~DwYDN64Jc0e(Eg;1O#}Rq~T4F z&_uU;_ugHxwft&g>9q^^l2jb!(4t5Wo`^I}xzf2#$U0E-aJUKpI zDkdh@TiZeCT7egJec9gDsUChUDRRW_)ve*Nu8_!W(aOO0G-+r{2$-u@q4sAGuR@+9 zd9yL!oD@|nBtg-|t;bZ1K9c)-d>wCm`ic1Lg>bNY0-ex1ngvFeRa6kWx~$r!Lu&$0 zKQv7(iQkT@r*$NX3uN}~#PgeVLMWXT^SrzVrV{n<3bX0-2!UafW;hboBJq?)BTp|3 zoC|lg|1zz4rZw9|qo=*SsOrrdlb#J|X*Dfha4`$t1f}rQ-ydq)xa>=%JV|16zBx5- ze0VpLBDA%&HJNKqTb*jpQI$%6ja3`^{!89?f9`hN)_}d3ni3y*A+}VMw@Ha&1zJNw zOHfe%K3}bccN!lTq|{`AwfIKb-fTB1m*{?ASX5Z(9Ti1W9p z;wk1!Rgy|aBthwGEhON#V54Q}k0%Bhw|&sZ93xHCRs)l%b( zY({G<83&KKYR9*fEiK%Wr7iYHxaL1^chSfi8ynN-?ds}6Dd+fr9PKd!mJJD`w&$gs z*>iKguCA^RneW`#SG#%O$5T3z|6gMi4;DH&Id0(2ZYv8{MfVROVvb3`LV7MXx9f?7*Gx#m4Sp@2cqN z*6Ce}IkCfLk!NFsFq+$D)H6LsoY%J1lP+8O;>j?wAUr$g2z%^It#H)!}ry!9%O z(B%>OZ-1F^11IDkIdP3-@@&U!NrD^M7RL0~-euUZb{ZcForF29W>K8~E-K>k=w>*= z_ho2k2tP65IW{`VQEJ~Yo2tdnjd%Yp4vvchD=I2B9e7v2d{X7?~wY3KRy(dk&}zmH!xuH6Ay0% zxL(Jc@$V?{g;NInFW>?L>FO6QI2Tw74CACSe>UyJKak|AS4&%aVsrlM+{#L%v$L}< zB)iQDw5L#73xQPT7{>Q&r+~2^DLD+)}nts^^`e0o_!h; zx+s`+hxJ#ou)^=F$v1&ZfZXaXdaqId?80VnG?GO2hSn}W-d2(8IXpIei@gz%@9ob0 z@F<0wIfQ$AhWqH>4)x&zpb1B4sUr~Ta6K$SS6^FGAEB!b*U^W=@fB-w|C10H{y68c8$tNcs;cI+UXT literal 0 HcmV?d00001 diff --git a/FSI.Lib/NLogViewer/Images/Medium/Exit.png b/FSI.Lib/NLogViewer/Images/Medium/Exit.png new file mode 100644 index 0000000000000000000000000000000000000000..d9ff54aac73030a34c71e46c5c1dc6a17af13914 GIT binary patch literal 4758 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 RY)SwC002ovPDHLkV1f(|UG)F} literal 0 HcmV?d00001 diff --git a/FSI.Lib/NLogViewer/Images/Medium/Open.png b/FSI.Lib/NLogViewer/Images/Medium/Open.png new file mode 100644 index 0000000000000000000000000000000000000000..b7b59b8461c1fb4b193e15dc6f34daa7cb37515f GIT binary patch literal 2032 zcmVY#dh={?0u1{qWmP z8@nd1lQd3(qNX81C{jwBl>ADmQ2A4ccnMM@kbr{PN-YVXA_1yE6+(c-LlhxV1X83* z6w(xxwzO*8IBzEoae^H?cGlkY?(977J%=ANv-aAFgi0tQ&CcArch2{n?>z1W{?C{B zpDbF_595)KL)H!eBd6XY0&5=vW>3Ef=k`Bt&JXqMKRQ{PKHbw@+StESF5AR4nTlRWCdF;})wRvyu_?dOMwy_(SzC|Qf5ZL_~aOB4@zVch_-oCZ) ztWvjcJAF|MWmtDA%h}jd(WkHc3=?bj1Jm!^VgmO)0USFD`?Ej7$2M(l`+m8!>aN4D zOyTm(IEopQiiP|gM#kULu}z=9_&mmkJ^@U=eTxV@@C-0Lj?|t-=_UqUDZP z-<(9nEyJ`0N*vgxMn0dqEt%Kb+BWm0b1!0S!-J6jhJ*CcxZ5^=@{Nc0u3DAz;YTC{jdw>ip57Ip zJPdu{Lw(j%t7E#__v{=aX)H4UfE6T@G1VWwz9+YON9W$op6tPFS`UB~L^L4Fp(8>9 z5D`qnL^5Iawze0OsdTDtJ@=(PJoM#*xG?;WEnR)RUnDX+U!NZyIF&kqguPNi@qv5t zn;u@bXW-sU*4Uh|b(`l4M3NDf2_Xvt8)Vo3*#IQ~!v=d-ku*wx7=S?_0<2=^YV^Es zKZcJ!wJ%ZZ|CE*JLyY#3yN3=3o=KxD%(ERbn~ z$PDMn0LVmbZWQ&|7a&pwMTV`REjv3#{=B!V?s4Drw2gcr1;Z;KJKqVN%z$DF0)PbU zT1ZMS#2!Q73Pq9{-|ND&j?g?tW@Hb@jid`YAEJG*_8@!>$#NN2re-lc)e75Afr!8& z5Ed{qSQx?_&WXTt9aJZ#(3+}|*2>HjI$-(r${4G*O%O#81xNsv0Ky6+OTiZjhzJD zQdmyH3Iq+&3c@O^Kh|KaA*=zdARHiRRB>AigPEf>LHIvM-w8LBv9tpatOn|zhn4+^ zt$Ad18g5x@}N zRoAU*d3MxyYYtH=Euw%3R3dMh#yTRv3dBLvoUn%IFy>%}Xl{fd?t)7TL_q9%>V&m0 zf9;a%EX-R8t3x;lvpohB6~#Z6HUO(2%z-9SVMrP(Md6C&Z|;gA6BaY5*S(Wg>FVXH zZmn`Poy!fz1eSUa4r3n1Ka^iol#t4clG2X|s>PCJxp_|zP@tt+t=2}Zu@iqQuitk6 zc%i+E013-RE3ozf_Q1*mYZt7-Ta*`q=|w=WhDa=V?71}X!`R1U!hpD5aDAb&@K5XU zU)SB8ADtY_7L%Ibn=zQ^2t*<|BT0or4@o!#jpri*@jET^UK$NiARxG|cV%w2bj>>b z_piy=$+KgbY~b4oGmWTjC6aK_aJbWP1W0j*R%IxHIjSRhzpoMTxR=fEq0Wl7^%zL$sTN6?D3Q>~qU?xo-PR;^M-tx}nA zo!X3@w7X&hB#Q*%&IXZ{-Zs4pq!Ih(qtw!o?+1=ktzJ0%!ymwMD)T7M&Xhd2{;!<0 z3=s@~1Rw!Pm_Z~02t`0xys`KmHJI?5Wx9(Xv=PY=1VPDhYU2RI`pkFEq9cLe$(GBn z_WSz%wr!;vDJ*dwgijKVJd{SFNh9N%cfdu-WoZi_X3?`V<)eRnV`}R8m$xI{#M6D9 zX7@cq#Wne?ooO!F8y~Tn+uDr}qK($OWE?2=M#r6tZ=Lfd0Jwzr_%fE9Gns*Z1B|vH zJD+AK_W%F@C3HntbYx+4WjbSWWnpw>05UK!G%YYWEiyS&F)}(aH99ajEig4YFfjQ* z()s`Z03~!qSaf7zbY(hiZ)9m^c>ppnF*GeOIW00dR53C-F*Q0cI4v+WIxsMZ9co4Z O0000pZuBi&I(g|XLon^!_|7dBc)_# z%C}#B#lcQT+qQ_vjRi83h$JHB1w{yVPAvIi|1r@tVje!JKGQn=v6QC&`H$Z{f4>Eg zrseV5Px$9oFFt&@zyI5}9_)#f2AKwSrxOm|+NbS0ZuveLiJ9W=hzO-=2zSQ5@~v+? zgl@&4#!){W=XU$M{?)7B|N7Iv4!`{1-3x$}1`ZF&7sorNvKC{FP-xQFRc9Cm8Z&PB zJ{G}=38Onjg#E@?yD}J@(2=ajwxhk*9X9GeYgW@=n)UkQUwrb6-~8mg8NdQ+fCX72 z5etx{sm3sjY;c;UA@geUB%x2?v%{xM>-&(&qmwUqbb7)-$55S2KYt-h_syXE@WJCJ zA8%f5E)-A?s?JZfKr}#vqE0^y?0BWz3Xt>^hJ&PLnSYNHo6Uy4*`=zH(!%ndMq-|= ztatFZQGB$HkmYBjWT$YfXmhAye1szIxcv`$_EXq#LBZj1m^>6ofvtAGrKabneP=~rb2D2^=BRduR4lLl&j0Z=`d zCPOV|1vE$zq#E14r$|tm=9UpiYP)8tid9828K;SM+tYhDx1jiJ-h^s%i>uGyy3~R| z-B5E{byyUj8f<$6r8MoW0CbgyN1wy#3k0xNM{N6^J~}3KXyRM}HJ<@At^$|^TNbwE*Sy0hm9qF?c>fAlS0W zs&?H2$yDt;gseE3t6Gt!|Fre^>$>_mw~VZOh*WA(knaCZk@?f$C13<{8DD zQk;WUcyxcwx@+GEpb_Dq-B2}%#b@(4UN)gR8uJ*+0^rdQ8TfL{-nHg65>+S8JYa_D zB>?kaoG#7*k-%KYnBARuHw{GQHO%MP&n4)_n%AP(V$SoW1r*0zh`hLH+@&&;$QfWV z2c5^yt_M-IKo@7uA>^1BGK0+WMjptFMFB_7qF8N?d@cvkGKOifDA1f=wcZ3EmKNxu zfSEIzVONtd&Yc-HE8rev29brk5~R!u_@V$7xCM>Ibp--drCQLa1CCh`k>r~wkc$H6 zr>x`VG?QMBVrQ)Lh`0vG+_y6m-L;b0h<2{PtgzgOVl|{1RZU8(Ann{YRS17052#<5 zkg9~5po*$pQlM7+=pW=bj*=x)T~0U2*T;qC>^5;n1W!2KY?-!OM90i&8ujZhq3Q)d zsNye=ApIje$)@f+KQTGow%=JvJWTG^2SKD}`PcK4m!IoqnPM-^l;yU3>jD4i zpPo^(uvc_VMtAKt`dS1?(M@#IN`epGfA5Y;{x8?R0rrnx69EWYsQ>@~C3HntbYx+4 zWjbSWWnpw>05UK!G%YYWEiyS&F)}(aI65*nEig4YFfh2&F5UnD03~!qSaf7zbY(hi zZ)9m^c>ppnF*GeOIW00dR53C-F*rIhH!UzVIxsNFj+SBo000?uMObuGZ)S9NVRB^v jL1b@YWgtmyVP|DhWnpA_ami&o00000NkvXXu0mjf-|ev$ literal 0 HcmV?d00001 diff --git a/FSI.Lib/NLogViewer/Images/Medium/Settings.png b/FSI.Lib/NLogViewer/Images/Medium/Settings.png new file mode 100644 index 0000000000000000000000000000000000000000..6395b1c5bb55dea837f99569564aecf5143383ff GIT binary patch literal 2911 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 literal 0 HcmV?d00001 diff --git a/FSI.Lib/NLogViewer/Images/Medium/Warning.png b/FSI.Lib/NLogViewer/Images/Medium/Warning.png new file mode 100644 index 0000000000000000000000000000000000000000..135a710efb2c7458945559e75b11bf68cbabd409 GIT binary patch literal 1975 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 Ba1Q_g literal 0 HcmV?d00001 diff --git a/FSI.Lib/NLogViewer/Images/Small/Clear.png b/FSI.Lib/NLogViewer/Images/Small/Clear.png new file mode 100644 index 0000000000000000000000000000000000000000..375b8bf6a09803b8fcee625fc5f38a949b5a1439 GIT binary patch literal 475 zcmV<10VMv3P)rCP_(<-a*jb_Hyre&wGyNNooK906+!+3lsI|p?tm?Ex#0xHV4K10Z9#DVK`pc ze*7w-lmAYiqVQ^K;s*qy{gNXl3K__@vT?o(V&K zcsjVVE#qaQIuQ57;gih|+H#dz(D2^m2pQGkc(XiPHv7qxcY;izAvom~vS-bB@7UaK zL)NX}h(uIcx2`~1o@>ob`KK>8W8A9k5@R}Q0cp50?UzkmTM})nYN>`oEg%iMGT-&} z_59V;^#>H9fVBA5b5zGCT|Ep8R4PHGL|Q!gtm(MZas<&1m0H7?fb{C)mF3rRxlv=@ zIH+Z>+^mjrjf~>_+vVTI zy0UHU5%!JGx)ekz-aozi-Es3zrOt`&vaJe*^)|wc3AS7fJ2Rzr#^iT0Y><0p#L@Gv z|t%b z_|oeaLz}LIhjjO4UX_M3^$qjapPTn|$Jq-DW__7ir(4B*=jVaKXXn0^0{z6`>FVdQ I&MBb@08n?0Qvd(} literal 0 HcmV?d00001 diff --git a/FSI.Lib/NLogViewer/Images/Small/Context.png b/FSI.Lib/NLogViewer/Images/Small/Context.png new file mode 100644 index 0000000000000000000000000000000000000000..7d79c0ad388dd8acdac94336c71f75439efba9cf GIT binary patch literal 451 zcmV;!0X+VRP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^XO*0N*(00A>eL_t(IPmPl?FGFDzhA$C=se_IN5{sdO zZUzGhf5VRw1B0o1+d(Qwx^ysMG)VXXW`cz0x$cqE-Zu3nPkQf{^SxQ==g4R|+W%H{`fXdE8p*=@fIZ%_-FG&`=2?HPn(-4U;a#GfgO tLV4QqH_su*E_j=L$mV%6J literal 0 HcmV?d00001 diff --git a/FSI.Lib/NLogViewer/Images/Small/Debug.png b/FSI.Lib/NLogViewer/Images/Small/Debug.png new file mode 100644 index 0000000000000000000000000000000000000000..2d5fb90ec6ee08f53947e0266a87b03f75893446 GIT binary patch literal 774 zcmV+h1Nr=kP) zlgUq0Q544c8(ae&UR$8ps&snq6^bPY3v3xAmMW74Di$h~GCH6E3TaYs2#6A<7K*gC z777H71_Wa;(dfp+g-drPCSWu)#PInZi72LJ;o?i~$-U=y&UbQ89Dul3%3P+Axkzc* zbH-y;QF=hR{qLItf%ci2_&e5wNo0gnVatG?ul6Zw=o$I9Ljfn*ic3`U?>IfEim3g{ zujU&$-hy6wn;w(xme|zJm;lWJxtTFfM)q0`kX!Vu0+d${$}LCddK1<^htTe-fUYL3 zB`SdNsZD>RgvLj1<^@h6_+cDRK2Brcr2~>%$*5S)hyV33PV^teac3%|4lz@8p4?)5 z?t5o^?q+%^%)Yygo~I^U4VR!bTnWuE35hcWrfCDR3q+sxJ79e7Fg`&)RCqLA^2^y^ z0laVfadW90_Fz8Brm|r47sB^u1VgI>kanj)Z4`zMSfHlm8>CwXa$JVM`$2RrmZB-3 zN10m-!;BvH*Br3V8t`DH7m`jf#2upVDXl{5ff18_pzCPK1Zu$$CKKvd8FGeFf)+K<|x33pc7P&S#3GZT4mEw;nr(Ze*F z3&*?-4U-lm*#tber5 z%S_ceqB`b3ko6r~BbvDwdohTvP(3a(pq{x#T$yQsu#OKwEe}KuH^Mh@nxg_(Nw136 zq#a^3xNBke)In+!?qk3%4wB69{pF`Tzg`07*qoM6N<$ Eg55P&8UO$Q literal 0 HcmV?d00001 diff --git a/FSI.Lib/NLogViewer/Images/Small/DebugSource.png b/FSI.Lib/NLogViewer/Images/Small/DebugSource.png new file mode 100644 index 0000000000000000000000000000000000000000..2f4fe4fc8fddfcc7ebd835282f2783d20aff98aa GIT binary patch literal 400 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJ=4@yqg0@wjGiuzAr}5~C)sixGLUF%=HqJGVHI7nN%b%D+Y2X!r{w8X@rNI^ezC0D z*4Z{dU*T8X)9fC$tzVnjFYU2klG&OXDSQ9B@P<4Or^tu9@}5=R`zx=ZyNo65jXZmtDL3i{|ILV|O^Vt3 zxwU{U*3-Fe#rSur^54sCi8sKs_BFSsM?3CGbl=EpP`xLf+9*bP$m8&)|oK5jG5 qIy}?q!3*suhSEq=%_UP-v!`agHon9+`!+DZ7(8A5T-G@yGywoC#+ljx literal 0 HcmV?d00001 diff --git a/FSI.Lib/NLogViewer/Images/Small/Error.png b/FSI.Lib/NLogViewer/Images/Small/Error.png new file mode 100644 index 0000000000000000000000000000000000000000..3e5ae9f710121753895a07b08d02e5054cd753f6 GIT binary patch literal 782 zcmV+p1M&QcP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGVx&QzHx&i2`0R{j702p*dSaefwW^{L9 za%BKeVQFr3E>1;MAa*k@Gd8K`;w1n80)I(FK~y+Tt&?3yQ(+j#4@#C{7waNN+J$se zLst>5+?qC{PaUp_g%VksYZ#Jdq|?D_QGT=~(p+p>peM2XKoSkHkBcm$IFR8CKf~n* z5o=*V=#D%8-ZSA0LA>(7;eBtO-}8U||L3Ks_5Sc{F8N1ayLsYqHRGzUX1>^NF~e1b z^i;vMMA{+**(M zwmP7>0&tcB_bvfOEl`jIT#UnXmJ}~D=lNC}(B%N0T7fsuz;RsQ zN8@cEM+$#>G$vA`(Vi-0T%B}=03kEevrVLk@5~p|mEeZn3jppz50D*;C2bUZN5avo zibiv;+9?2d!}ys4vKx$mgWTUe4+46dz@6I#HZ2khs*M;_M8G1C=@tOI+q_|@&I9i2 z0gDdktP76dG{Ap02JA@@77|17Js}h~_CFH&|Oc~4Po$~^~U!Vl55o7V_ zX8cu9n3RR!dYt&P02r<;WW3i>mfgOpB4;9ypFq^)gR961%+8+Jf(0dop9vIR?+-(n zR2)<=)o7(hNzS}cd|b$m16P$RC}0g5EGC7*E2l6cqhObW!>&;TP2{FW3FW&*-?|Js z{hIHAofwMm(52NpQ0`<(_C|dzij5pIO1F*GrpTUra#&8S_v5Ah15ek*em$svuK)l5 M07*qoM6N<$g2^^rkN^Mx literal 0 HcmV?d00001 diff --git a/FSI.Lib/NLogViewer/Images/Small/Exception.png b/FSI.Lib/NLogViewer/Images/Small/Exception.png new file mode 100644 index 0000000000000000000000000000000000000000..bc2ec8429477901e1bf908862b32926bccf8464e GIT binary patch literal 943 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GXl480Q7}gt!8^^XJcBuwcRT>C?At z*|KZbt{F3COrAVBI5^nT({tj)i4!JFm@;LGlarI3o!zWivkn|MaOlvXg+8F3-`>xkKOH=H0O(m&RaJR;c_}F=Wo2a(6O$=Z zCV%?$@&5gL_4V~Y8;y;Pw6(Rx#KdfEZ6-~cxN+l#_3PKon>TOCl10;|O)f1h0eVM7 zL_|YF!_d&s#>S?wuwc`s4RhwqQczG37Z(>25>i)JkBp31xNu%lQUcH~Iy%}wkB5W= z2L$*>M@OcnCb_w}8X6gfM}!Fq3R+oPX=!PRii%D&by*CIA-j?wKVXbu05(!_CY2t=0W`O+EA2d|h?L_4DQ9?f)|@cgS^>WfOdwsU## zlF7;5*@+3WSI*>Pp1yOITSCZ`2OC z7#SFv=o%X88d!uFnp>F~S(#es8kkub82nn>&x@iVH$NpatrE9}?hoc0ff^V*UHx3v IIVCg!01jeZTL1t6 literal 0 HcmV?d00001 diff --git a/FSI.Lib/NLogViewer/Images/Small/Exit.png b/FSI.Lib/NLogViewer/Images/Small/Exit.png new file mode 100644 index 0000000000000000000000000000000000000000..cf87d2c786d63a38b660aae36682a3c45c7c42d8 GIT binary patch literal 629 zcmV-*0*d{KP)L55e zb=0X{n;;dWh#fmrk|9v-rr^*)aIp{(OtuE8bu)H|yq2IKS}dZu$-VD7q|F~vBt3B9 zp6`C&x#xUGe7MXF1CI?%a*PnLCE%VYO|o@rED{?&H;!dHeTjXo*!!~0&z;Igr>=>G z1{`GREojx>_qIbQ9O0WLW=RFotI&{&hJuCy`%@ny#SosR0(xh^8s~p2y~oUtGL-i`Tgm4)yF;Gb)32zh`7ENr=KsAvhvQcDEw7De(;=u{b zRU7PH-~JmKc(1|HnsUWw;;iVuhz52IXhYetHS<+i_Ta*CI&k1~5a#~@`!MuT8?2?3 P00000NkvXXu0mjf=QS9< literal 0 HcmV?d00001 diff --git a/FSI.Lib/NLogViewer/Images/Small/Export.png b/FSI.Lib/NLogViewer/Images/Small/Export.png new file mode 100644 index 0000000000000000000000000000000000000000..35f3c3965e1f33b117d933530d483d68e23f19de GIT binary patch literal 1196 zcmZ`%YfO`86#iht3FyE99paXmnI+1C6tn|bT!0j{lOZbz8$tq7O4+O~(6p3EH=H3W zDh>qNB4j9A0+XA{WhfVGX-k1#2;~l?rO=j-wzP$|^fK66vLD-zJ<0i=@4W9h&->)$ z&=V8RAM^_Hf*|N1<^mcE*w+>N-vHm^AwEff-pq~pA_jt<-uHH9c|edmHZeXq4xCeq zigtH*hlhuyQt9;6)F4kR5|0D4x3@PnHONy+Y&Ki1R!>Y!2m}HKgQ3xAW@l%)TrQKz1ph*zkk9AW z*SnN~!>v7-&1S3BYOz>=AK)1j)YjH!WMlxtJRT3ELqkJAwynK=U8~jVbin_H!2pU) znnFrU*{-8UIscm5czcq%Gu9^M2(X0y$<-OnA*qBRs$_0k%6 zC5)>3cS#tK-s zu!3U7Q|SqXT??drwzXm`B#O&mx(zq{~t0R(ybxxx*qtqTMN zJ{WXNa^OUErd;{1um3v;1me)406#`1F0-<#vZkW?L26<$7Mt>A4n7l`bm^jacx*%@ z5ROhuaBg0N0GvM}fKgRbol02m2uH5LIVmZZr=?Sq5vSoJ9bw4BL8!~9p3d$r3Wv7A{aCAg zKalxeeM(zeKVJ93eB_hs`Q)s(y#8#P?aNv3)_qFW&*@YmH-E#-bLyy!=&*bcsaabU zdiopOf@fY5Cm(SJXglc#qD!D(%8BR8_wDm2I0bpc#&TXC`>^qG_ElwJV6?l@lTN2& zFoF}!eMdiozR6ENd%MEg59aj|Defy0E{l{Cm7Sjh2nt7roen{s2?;-w92ORZiikQD n8G=MbA(6BbL4^M_5O3h}@YMfr@F6{xf(8f^mw;}I&AjzDyqKrp literal 0 HcmV?d00001 diff --git a/FSI.Lib/NLogViewer/Images/Small/Fatal.png b/FSI.Lib/NLogViewer/Images/Small/Fatal.png new file mode 100644 index 0000000000000000000000000000000000000000..c26cd440c3bc9cdd4962242b7553ee54a8ad44f4 GIT binary patch literal 589 zcmV-T0Px#1ZP1_K>z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUy7j#8fbW?9;ba!ELWdKlNX>N2bPDNB8b~7$Dy+xzR0004~Nkl!kPZ-~Y!3 zJUl!u0Ts64Gytf%1ea#0fgj@IVvwG^uhR8&+Jp1E=b#SHW?scvcc zZ)9XthSdNyHMQB>w{QOsl>9HQuKs`i>h=H6T)6VzFD?!&791Y^zrMcyzlDWG7FGka zw6uDArcC+o?H~NVee(4GhfkmW4{`y>fa>~||JKgV{|_8E@ZZwXG6Smt4h{~n&!0d4 z4>AO#dBcVc|Mm6t|9}7f{r`*=EB^03eE2^|-ptG_4`*5cYJLO@1dxp&13(%<02Dqz zK6d}ZOtiPRH->4LvtS9>6?Yyy0edB@sOUd1v321~%FI9mp6BQ1gEb&ykl#V65U6<* z-n^itt=$V!42mw0zd;xjCLlvW7_VlSB+!}FAU`9!VE+91Am?`zWdKMKC}V-*9E3qm b$E6tnua>Nicm^zE00000NkvXXu0mjf6v6p8 literal 0 HcmV?d00001 diff --git a/FSI.Lib/NLogViewer/Images/Small/Info.png b/FSI.Lib/NLogViewer/Images/Small/Info.png new file mode 100644 index 0000000000000000000000000000000000000000..12cd1aef900803abba99b26920337ec01ad5c267 GIT binary patch literal 778 zcmV+l1NHogP)BVme|mWaqy4$_pJm?y9KM{-*hp?1+Ey3e-CEDooTa!B;e(Q>TSF?bj>5At13y1p zriN3w3x~5SfZj{@J4M{kp{?=M_Lh2bV+5LH)Q)5W!-ePA$RgE1@5f1cyHki0Y}JyVEYZF(LD$xXlt$7A5CgE@ zpV-&l%vf;=5kZ2-2gi@Y6J&=cuwt>!vJ^#(&n|LcZyUzi6Duj$$hJ1s*HD-#;k-w@ zpdrwAuoDG_N2bvb07G$Zk*?Hc)JLtW4yqOnic_$zO7NZ#l>Fm){;fE?b$IbOaX2fe z0la4g0Dfw2xk7Wi7NapVD8YMPCZu?A1QCK*67dgsvRKBLFtrM>?$%&_lD1882mzdO zWPdw5KWw6IT`m1b_8=lS5jt8D3=RDa=&jWzR-)S@56WMslZ~mKu1)-wpXB>rNBQ>N zU#K`#1B&v|_AQK;7I~B}OdGiUT9LX>f0xm6<;LeP!=vFjPsUQF*wCJ*dO)4YBypgdiuF!=i@6Zyi7F|q#K zz?tlSZULa@t1D?$e;f@b36&N!V2mjOHw|*P_N#{XBQPuD9>UDFT=LaHsAT!i5 zj^krd6dxw+EX$5EO%tVQ8kq>p^UM^-@llB^%85RxlO%ar_x29v;9>=a3#F!2Ez6>= z>uBBE1MYzzJeVLi5ZChHFMc3DWIk<43SJ(=KVR$oG*LCkM z9ALMmX{apA)2$4mD0&sO@0oyY+uDH&2o|pjIF5s?_`(6|--L*{&HyTCh{)M1YexeHTUh2A*s;W-d`7eMw-}m3y^So!Z&y$G*^%9?q5Ah#-3ornObN8$* SQn5e)0000Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02*{fSaefwW^{L9 za%BKeVQFr3E>1;MAa*k@H7+qQF!XYv0004ZNklTl+$WWV26 zr_)irURSA9a{Scb(E&V80I%8Yb`226N4Z>9yWO@tS|?yM8p-oKHJeS6}&vs9z)5_=bDi(_tgrPy}{73{* zVE>RDAlt}hvj%Y0YSkPbnlE$wO&~ci_DC3DPVLXj6u%t*xz0bPV-~&v5-6Sk0000< KMNUMnLSTXdW8547 literal 0 HcmV?d00001 diff --git a/FSI.Lib/NLogViewer/Images/Small/Network.png b/FSI.Lib/NLogViewer/Images/Small/Network.png new file mode 100644 index 0000000000000000000000000000000000000000..98024504d0bb8a4fb9a2441a3d273d05179d805b GIT binary patch literal 506 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;js(W8VM(0c%M_K~y+TjZ-^r!axu;#)V}YJNO64mh8$B zoFH8|Knkc*CP&~1R6$V+4v>PHiZVqCZbBC+w;=CrW(~1O%#%hto_X_jc6M!CLLA4d z;c&PajYi7oyRN&CbUU&v+lX5u2!f@!?clEB*68>9*9)X+N&)NV%P@+fuyKUz1$w>S zeW%k|(z@NQUZ;|7hv#{(uswvfShraBzVE+D`hT!po|lGM%=0{-bAYtTWa0_!gd|BA zoJxyowJhtFIf&g0%mdSgQmyNkd;53kHLM z$~CW%HGc}6J({|M=0l=zEr9lRBybn5j^pfvR|_!4oaV7c32;!D?&Gw{K8CjC)EzvYX$Jy8j(F=GiG6D2Za>y1zWLT(=K;NIN0!)@T)jQy z!3VfvixU~Z!P730XHTvF_;d{-qS`#9WJ^)mF}a8;6Om;il1xZ~=dgg-@f#uh!soY( zeX<)|>AhPMgorA(k5Ww4Kx7R>nuo~q5Jdw~RAMs3jccondC_0eHhAT{d}jgVq8R)| zD=(jsoE_vxEzC5lCz^-bFG$$v<;7=jR-m4Gx=h4aR15wxcFlDWRZnSZ8QZ86%!mjI zL6kyTtW(y?8bb#-cnO~&6Xy(au-%oIrjnCVK1EV}viaWEx0tBLvd|9p=?->eM|F66 z6~6ruPE;8rdKf4y4`?e35SID3!7TM_EcPzTcHXlK!H99lJL|%tBUyB37X1(_)rpnz z1uMnzTCyW6+3`GazvrQCCvTgdx`T+U1yQx&Odm*sK$;RTrhraSp?gvNa;k1&`iWLi zC7Y;goJinJMR6wx?IT%}vYt7$O0Qqk>kSLLn5Oex^YNTCkv9NT-(7L?9d!>DBn*DWYs%S}(ryseb>HmJdH+AkAP2Ejacaw}7 zo?(`~I9=H(^o(Oas4T;=o3$?lYicCw;1 zS}q{Sn?mK1i{o9)u@3sEFma@XG}06^%#Rr2;fJ`mp?d6K%b9^@+CUSz|4Dp*Lv$ZE zqK|`zYJ;UUr=)+t49e_4uKB#hf_$cIm#e z4+f3KxLBCkCa(&E8jP<@rWJv`^%cdsLAeg?xjZTTOusQ1)4Q>*EMMP{FxTFeV3$_u zE|ZIByIP&*J#@l@2q*7<;cSTv?zs*hw`O3XGGNF2qX21&7XW6Kfqp(=pN>+9L?TtC zC6T`c33hQ_m(9XYRQwo=!$kUp-L!D*bUM60D)xW_vInuN=;yl;zjN?mq2VC}ynJYk zJR}<)uRS+(9Cg&~n5+8{0g>0pZ%#_(H$6FbHi@2+#h^0MjV}#)F ze9Z~ZK2_nGAv1Vn=myqIRMT=Ck1?!v`0hS3z9D@)d2hU>_ojP_oHN5q8`UDC1@x^} zR4be54vMZ`d2!V^c}3NEwFsBbGhMsBW3R^#hBr6vvaw}_1=NBYqmV%Z1B@&{v@KbUea0(uM%P#)0V{ z$)u8)G*3!84L0D0ay^Pfc_7_9!d%@vUEMv8cpy>ko+#9C%QWXd0s1*=Qo@D*4?NT) Qd;|wTpg-2H-j|sBH!5FnMF0Q* literal 0 HcmV?d00001 diff --git a/FSI.Lib/NLogViewer/Images/Small/Pause.png b/FSI.Lib/NLogViewer/Images/Small/Pause.png new file mode 100644 index 0000000000000000000000000000000000000000..ebfefa8d34d5126d9c7cf76b39150bece436f42a GIT binary patch literal 1261 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GXl4m{tb(gt!8^3|!jGRudQ)*wnWD zXW-UkVBnUYewR_ukjJA^=l_5H^c74(&MZ1OR}&7rO*`@-aQ!`l)*bvFl|XxV+)CAY4jIh6 zBpB8OO05fRSV?uXDkrN+rXsc#buqwS-71&dq1mtJ$G;iOUxQp-#+e$ zNi5zIxkD$iy0r6zPGGTXVRdQY@oD7Pc;S;OeRirIZSgK;l|<@A8^t&z=# z*!)&)Idtd8_umIkKjQUR$Y4E_!DcG6aXEu@GJ|SGK<={e+FfjJ3$`4%b>PH39_tAV z+6@dEWeno+3{sf^sk6R({t;HRmd&hZ%ie4Ij@;zYsbG*!XH?E&P%C9nDi6q799q1A z&1%w?eK+irv&lbi^}DxUL&~?aInUdA@b;fyfA$=?!)4aZVARgw zGTShE+1gz<*YCY+l)Zx~a6`@9^Sh5esGfM3#cn!ti5CN~8s<)(S??jBGWqeJe;>Acu$Z5D zlgFxf@`p595;Yga29w(76WMyFm^kcZO6dCDDCOu7$R|*QGoINKaevRg+)Zg z#3dx9m_R%RW)^7~S-Hd{c?Cr!WmaIWVpma3PDxEm&&bSDQ`g{N;MCO0&dJToFDNW3 zF45NEV$jtqEi136tg5c5t*dX)H()R{YHVt5X>DuosO;?OHa1}}HS6i^Yw4dbaZ=^v zDO0DJGgwTYF>_W+|Li$)=gnWRaFHd0)#4>fm$mdSU$JuDs?}@OS~J+#u3NvMW#gvJ zTjp)uwta^kgT2GfUAtR0?%BI<-u?pz9i14QT@D>Sa@e?Ocoj&90#=!0FarWH# z3l}e4zH;@NrqG-s?PsvQH#H}Iu*6T))-JY&~F6*2UngHZc@HYSe literal 0 HcmV?d00001 diff --git a/FSI.Lib/NLogViewer/Images/Small/Save.png b/FSI.Lib/NLogViewer/Images/Small/Save.png new file mode 100644 index 0000000000000000000000000000000000000000..a6cf4c901ea6562af4007f0ff0b4d3872e86cefb GIT binary patch literal 1026 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GXl47%v9+gt!8^eWz};ow(k6{z3cM z`^{$`HJ^T1apZ30(R+D&ZshH`nY{UO@|MdHtIzo?I_bOkq|>Y;<`eguPuj23xl6HO zi(syrK|a~<_lym=sI?F`sIgg>f!mo8nteBr`{b7#(+K7D50x$Cp8 zKkYkzzi8{x&eL~h-g&#^?%P9WE?mBHG`&u;!U9UNKFK6F_CFdSKeDUVNi?{19JbeEa1Xi5B`})=M=m=4bxwPhbU zJ3UWouFQNXnf5G)=Z)C3nUOawcUJynZFLP3li`_j&FrY^($u9-MW=>d-BuREbLShM z>DJP(UwM0d&+77hv*Fp(=eIWZt;2zopr069qp0ssI2 literal 0 HcmV?d00001 diff --git a/FSI.Lib/NLogViewer/Images/Small/ScrollDown.png b/FSI.Lib/NLogViewer/Images/Small/ScrollDown.png new file mode 100644 index 0000000000000000000000000000000000000000..5891219e49603b6409d5479247ef1fa8a8cf71c2 GIT binary patch literal 623 zcmV-#0+9WQP)9KeakxIdTpje7cQjq<2c!^ z`Zm_SltDZPAt&#frRYyLt2KB&-G(%{q(iVQLTLEmE7;x%Q2E-zMx_cKcr*5=`6qt_ zJ8$Qx>E38HYSm`*8wpg%DHAF6Ak@qu=tdr9ZV&@0hK{|pLTM+EAS1zES!j~^>gMV) zSJgD~g*+^)fTA^sp+W%}T|?#b>p<{m+*@08kigJI_+;7}FTlfl=m%yDpG=!Ydu;Nd zxN@f?(x%l?jNxPW8<>{Ae&FyaVOl4ItmVe>FR)CpL^X>&_z8O)@9BsigdhL_002ov JPDHLkV1jC@76SkP literal 0 HcmV?d00001 diff --git a/FSI.Lib/NLogViewer/Images/Small/Settings.png b/FSI.Lib/NLogViewer/Images/Small/Settings.png new file mode 100644 index 0000000000000000000000000000000000000000..a4fd920dd2659c454cc92011cc5acf14f5217007 GIT binary patch literal 1306 zcmaJ>YfMvT7(UQ4E|Ybg0>a29P7TgAwm>T|B(Q;kGAICw^Aw6wIgwl-+d+}sQ}cDvnbwE}s#wOB0O-QDTw=`AfSot>T4)zw2o zLvTJfH#a*wJ2Nu_;J}l`VnG6E92^{k5;!*)41ioyQ?qH)rktD{pfo-{4h33`hR5U8 z*Vot8)v?)Z3WWk4l}aVQcQEZ-Ik5U?>2$j3=^3R`g?7%Il+5Rf?}HqZ3B;M31)^Qq zqC-M6>$)YY?QUsliSD7!WHbTD*}Sukgkv5lP04L0w8MOyH`LhJ2v7#S0VV()0o*Bo z=|Sfu3yci0@km3zUatpV`uioI7c!fgn(%l$n2Zg~@}OU(@r@ZG!?9K=hyvA+Gchs2 z=ko~!0)lmS3Oea=xRoZf9_yF_7i=~gbOA>W95{fu`d}%!Ug@G>?#R9$JIcz+z(gQG zrBV^^5VtUn$JcCU1OYo>j4&&e>VbMfBb6(vyYE{qR&t2~#DbyZVwuTkhG|oZWt0+m zZ$OU=Xc*=s#jk&g|F_I3-&j*HIQJbrVlT$4w}lv=hQuv(<@k$# zN)vcb4*Om%{s4Wo_WTbWVQcFJV&B@@Gmf)=kMZrxpD*){;)rs^PA69f^4QvoOYWhH zHPh7ZKe#zWs7(iHw&!PE9HO<0N3lojt0$a7WgV6mY!_$N@=`ih@U%%+iE}-(IvvA% z`MBO|!}%xo_kQs`)AOU82+ZtV$*;iP0X?`s3R{zHPJ|cNyqMJQAjbT?_l=(lhXj0V zRAlmI9kZ5B&17VvXjWoUO5!0V3#A%0ljw0KYBXr|x;?}oltH49$n&$Aq+j|5`fuI1 z$z-56&gXILC_CT0`grNt-1w+W_H^;-yvn{jvU>~BKN#yjD%t(#RO5{HxD8m6COPFamy^sX${zM(-J*Geh87w0;j zDp_vfe|aWcT2fZ!xjXf9xoq3;>DQHkyXd6r8It^|i{7=TGWVRe4P1C%YRI*o?+Yw0 zwoRlDy+RPRn6@AZ^ZX5_w4D=un3H*&!wO}xSrCu_A}NSK3?T%BB$EO{gMvc?DFh-p llt^q(t+@5Cg4{EiC$ld6cfms}Y5gyV#74(Q^?b!B`3p<%eO>?n literal 0 HcmV?d00001 diff --git a/FSI.Lib/NLogViewer/Images/Small/Thread.png b/FSI.Lib/NLogViewer/Images/Small/Thread.png new file mode 100644 index 0000000000000000000000000000000000000000..22bcf3aa01699c3fdc6cc0bac00ef0eee0eae5ab GIT binary patch literal 1419 zcmZ`%dr;B`9H%vHYr1SrM}-+FDUY8D@=yfR6yKQmz(>>53QcFDP%AAf(tKp8fdXbe z01+Lj6+TeNw-%vT`I-jGmPKpM-R-t(yW5TZ+JC# z3kvrfX?Wo%G?43*T)oXdYs_NV$>8peDsc=f{}g%J9&r}!EeK@|#GadqIzN8o(p2JA zJ@bN&maalE>cjJfm?hJ3l{&ge8{0CQRQK#CZ!U@dJow5m^>Pn`|AbkocWY}U_V)P= z4;>mG4lN&vlRS%QnMJ1EA#%ICZ};Lmdz_|)@Ohs1D+T%WJ>R!Ixb+T-S{>c z%NhIx%J$9e4y=BNlC@$crS3+t)ADuntDEj`Ydl`x#+${2g--v05qi~RME(fILx`da z0}E6!ylMN1VmAZ-;A#owrxKF+6#0j%)VDQQGY|KD8`Y$u<~|6?)A$|j2I3nIUsAzD zwXnxkE-!8(mU6LcSr|hU`8CU9Ez{*i7Gb?La6=QK(*_r5sA*j;M`}Rl@Wuv&z7ANg zMjB4J8xx_EDCC?k?z=d*I%7{%TLeU!3Z;_(h-L@kBW?bg!t#Z<}ul}f_;1>{N^d_D|k zigjH{L9FI`y=ua(v?JT4#4`$PvSdHGoSdPEubj5&EOeW{?YwlwL3eE5O!|SROqYdB z)M`0$jZb*lK`wki$ZkhQ3O=+-K{5nB1zm{xW@k+ue4!k%R^_!Ja5vu~ypf{k8(qg6 zXcH6UQYCPrWrrhY7ydjvjfX4~dv$g~$BUukrO?M^@VP3$&;%W*a27UU`CX{o=H2vC z_(>kAxSPS7vAC14bQ)fusD)5OzgYE7GRDcj06RVz&f@iZ_#-)X-~SX0Z(I0o68u{+79z>0=o*~dHBHP_MUDS@#OM?(^h zG&dG=xpN~=AAdVBKW!L${$yoJP&uk!9et)7Oq z+%CFY$-&ts8~b66liaGqE^fW-oy v-f>tGnE<92;7KHVdhRQ>Q~pbEihUw0qu~Dq?A7)ipa2p^iwf#GoObnZ-(`7? literal 0 HcmV?d00001 diff --git a/FSI.Lib/NLogViewer/Images/Small/Trace.png b/FSI.Lib/NLogViewer/Images/Small/Trace.png new file mode 100644 index 0000000000000000000000000000000000000000..330e7f8541d63c941be419e50ad5b9eedd88e043 GIT binary patch literal 631 zcmV--0*L*IP)Px#1ZP1_K>z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUy8FWQhbW?9;ba!ELWdKlNX>N2bPDNB8b~7$DE;K%k%ys|(0nkZA zK~y+Ty^_1jv0)s?{SQjYAR9(8*ced4VsR`IQWjuW|Qytd_F0w zB9qBbC=@UnjlS-Fzu%Md`Aimz1(L}mI2L%lUi{#4xg=t-7z%{~8jS|rc7*O+OrqE8 z(d~9|zuzebO%QE5ol=QJ0=Zlc2ADGuCSYCJfKsUh1N7%*v92E})U!LebL zO2rGP)oRpgwYQh`csvZZ+f4}Vhm+Ikq*AFAp->3(`TYIR-wvMZ{%;RC;ZLJ)Ckzjo R?(zTt002ovPDHLkV1k*X59t5^ literal 0 HcmV?d00001 diff --git a/FSI.Lib/NLogViewer/Images/Small/Unknown.png b/FSI.Lib/NLogViewer/Images/Small/Unknown.png new file mode 100644 index 0000000000000000000000000000000000000000..74f0f574216cc00b4b0dd870d021e038ac0e6f7d GIT binary patch literal 582 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6n3BBRT^Rni_n+Ah2>S z4={E+nQh0wz}VsG;uxZF-gctB#}!5fxB2^jADpQfQ=(e2^!e2QSrZP$wXMP4lTBE3 z1-X)Vb$8AP_7KSxlobqgW;qzhr+ZPLu{AQV|8?(Et^Afv zy@EzM8$DZP_$@sBxl0%>oOY>Dn<~M@#u1TxQUCQ+_Za2-lgcJ{hU)z|=o`9P&pJ7N zuFh|UMQ4s^h3iHa9bD5N`(b_P``H-_xb&B-AI2S*Um95e|YWR zuSKiA&oOztBT)F<>iaU&(mzyQ*|aKE`<3+Xp5H-hE92_eRVJ4(U2ttleHZk=g1upa zN}`Sm$Bk3!=O!lic$P5X`g?rOnwuF^cDVGs&8?k# z{R5w0OLp+v&UrJ+j_g^*n|~`d#pY1|vvo_AKPvd1U^BhMbJ?}oa@o(RPpuBf$$h)F z>}=%LmDggwwl(|46;!-lQ>W+VFWV*m)yBKRt5&T m20(_v`TYwwplHa=PsvQH#I0f9BS{{h1_n=8KbLh*2~7Z^spY-^ literal 0 HcmV?d00001 diff --git a/FSI.Lib/NLogViewer/Images/Small/Warning.png b/FSI.Lib/NLogViewer/Images/Small/Warning.png new file mode 100644 index 0000000000000000000000000000000000000000..7616208a6083d3ac2e06ccf466ae17455fd10524 GIT binary patch literal 813 zcmV+|1JeA7P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BKeVQFr3E>1;MAa*k@Gd8K`;w1n80-i}kK~y+Tjgo6flTjGQ&)&W7hHh()7TehvzxZ|92kFIfSgROtmD0f4k2$))S4EYT5h344?BW^)6c< zs3(^k{C50UI0chIDd@Af@7j|Q+?pVkW}>!ss0KyP5dd*i8kFX6t~(iA>Y4ywx=8l) zaEu@#5xgxFf*2}xH*r6Uvsufk09z*s9_bD;LCC_x>f_k9br(wXyXh1vl;ucWSG9p> z{|hlUkn|aA0ySJm@`XbnBmt-657K-++Upn;Wy*(E1PnYQs^L~mujtOFhBW94_kbZ< zJkal?xf=6!1xj?BTbHDXSr#(*&PnuO0Lf51WDb_8H@PzHLL?zF`4h`%6q1372! zk8&-U4+DZ4{U3dyjf=$ikPH|jaPjNlacsoXyNsBhrmX)1m@^W!t + + + net6-windows + true + DJ + true + Sentinel.NLogViewer + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MSBuild:Compile + + + + diff --git a/FSI.Lib/NLogViewer/NLogViewer.xaml b/FSI.Lib/NLogViewer/NLogViewer.xaml new file mode 100644 index 0000000..664f7fc --- /dev/null +++ b/FSI.Lib/NLogViewer/NLogViewer.xaml @@ -0,0 +1,213 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/FSI.Lib/NLogViewer/NLogViewer.xaml.cs b/FSI.Lib/NLogViewer/NLogViewer.xaml.cs new file mode 100644 index 0000000..0cc1cf6 --- /dev/null +++ b/FSI.Lib/NLogViewer/NLogViewer.xaml.cs @@ -0,0 +1,543 @@ +using System; +using System.Collections.ObjectModel; +using System.ComponentModel; +using System.Linq; +using System.Reactive.Concurrency; +using System.Reactive.Linq; +using System.Threading; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Threading; +using DJ.Extensions; +using DJ.Resolver; +using DJ.Targets; +using NLog; + +namespace DJ +{ + /// + /// Interaktionslogik für NLogViewer.xaml + /// + public partial class NLogViewer : UserControl + { + // ############################################################################################################################## + // Dependency Properties + // ############################################################################################################################## + + #region Dependency Properties + + // ########################################################################################## + // Colors + // ########################################################################################## + + #region Colors + + /// + /// The background for the trace output + /// + [Category("NLogViewerColors")] + public Brush TraceBackground + { + get => (Brush) GetValue(TraceBackgroundProperty); + set => SetValue(TraceBackgroundProperty, value); + } + + /// + /// The DependencyProperty. + /// + public static readonly DependencyProperty TraceBackgroundProperty = + DependencyProperty.Register("TraceBackground", typeof(Brush), typeof(NLogViewer), + new PropertyMetadata((Brush) (new BrushConverter().ConvertFrom("#D3D3D3")))); + + /// + /// The foreground for the trace output + /// + [Category("NLogViewerColors")] + public Brush TraceForeground + { + get => (Brush) GetValue(TraceForegroundProperty); + set => SetValue(TraceForegroundProperty, value); + } + + /// + /// The DependencyProperty. + /// + public static readonly DependencyProperty TraceForegroundProperty = + DependencyProperty.Register("TraceForeground", typeof(Brush), typeof(NLogViewer), + new PropertyMetadata((Brush) (new BrushConverter().ConvertFrom("#042271")))); + + /// + /// The background for the debug output + /// + [Category("NLogViewerColors")] + public Brush DebugBackground + { + get => (Brush) GetValue(DebugBackgroundProperty); + set => SetValue(DebugBackgroundProperty, value); + } + + /// + /// The DependencyProperty. + /// + public static readonly DependencyProperty DebugBackgroundProperty = + DependencyProperty.Register("DebugBackground", typeof(Brush), typeof(NLogViewer), + new PropertyMetadata((Brush) (new BrushConverter().ConvertFrom("#90EE90")))); + + /// + /// The foreground for the debug output + /// + [Category("NLogViewerColors")] + public Brush DebugForeground + { + get => (Brush) GetValue(DebugForegroundProperty); + set => SetValue(DebugForegroundProperty, value); + } + + /// + /// The DependencyProperty. + /// + public static readonly DependencyProperty DebugForegroundProperty = + DependencyProperty.Register("DebugForeground", typeof(Brush), typeof(NLogViewer), + new PropertyMetadata((Brush) (new BrushConverter().ConvertFrom("#042271")))); + + /// + /// The background for the info output + /// + [Category("NLogViewerColors")] + public Brush InfoBackground + { + get => (Brush) GetValue(InfoBackgroundProperty); + set => SetValue(InfoBackgroundProperty, value); + } + + /// + /// The DependencyProperty. + /// + public static readonly DependencyProperty InfoBackgroundProperty = DependencyProperty.Register("InfoBackground", + typeof(Brush), typeof(NLogViewer), + new PropertyMetadata((Brush) (new BrushConverter().ConvertFrom("#0000FF")))); + + /// + /// The foreground for the info output + /// + [Category("NLogViewerColors")] + public Brush InfoForeground + { + get => (Brush) GetValue(InfoForegroundProperty); + set => SetValue(InfoForegroundProperty, value); + } + + /// + /// The DependencyProperty. + /// + public static readonly DependencyProperty InfoForegroundProperty = DependencyProperty.Register("InfoForeground", + typeof(Brush), typeof(NLogViewer), new PropertyMetadata(Brushes.White)); + + /// + /// The background for the warn output + /// + [Category("NLogViewerColors")] + public Brush WarnBackground + { + get => (Brush) GetValue(WarnBackgroundProperty); + set => SetValue(WarnBackgroundProperty, value); + } + + /// + /// The DependencyProperty. + /// + public static readonly DependencyProperty WarnBackgroundProperty = DependencyProperty.Register("WarnBackground", + typeof(Brush), typeof(NLogViewer), + new PropertyMetadata((Brush) (new BrushConverter().ConvertFrom("#FFFF00")))); + + /// + /// The foreground for the warn output + /// + [Category("NLogViewerColors")] + public Brush WarnForeground + { + get => (Brush) GetValue(WarnForegroundProperty); + set => SetValue(WarnForegroundProperty, value); + } + + /// + /// The DependencyProperty. + /// + public static readonly DependencyProperty WarnForegroundProperty = DependencyProperty.Register("WarnForeground", + typeof(Brush), typeof(NLogViewer), + new PropertyMetadata((Brush) (new BrushConverter().ConvertFrom("#324B5C")))); + + /// + /// The background for the error output + /// + [Category("NLogViewerColors")] + public Brush ErrorBackground + { + get => (Brush) GetValue(ErrorBackgroundProperty); + set => SetValue(ErrorBackgroundProperty, value); + } + + /// + /// The DependencyProperty. + /// + public static readonly DependencyProperty ErrorBackgroundProperty = + DependencyProperty.Register("ErrorBackground", typeof(Brush), typeof(NLogViewer), + new PropertyMetadata(Brushes.Red)); + + /// + /// The foreground for the error output + /// + [Category("NLogViewerColors")] + public Brush ErrorForeground + { + get => (Brush) GetValue(ErrorForegroundProperty); + set => SetValue(ErrorForegroundProperty, value); + } + + /// + /// The DependencyProperty. + /// + public static readonly DependencyProperty ErrorForegroundProperty = + DependencyProperty.Register("ErrorForeground", typeof(Brush), typeof(NLogViewer), + new PropertyMetadata(Brushes.White)); + + /// + /// The background for the fatal output + /// + [Category("NLogViewerColors")] + public Brush FatalBackground + { + get => (Brush) GetValue(FatalBackgroundProperty); + set => SetValue(FatalBackgroundProperty, value); + } + + /// + /// The DependencyProperty. + /// + public static readonly DependencyProperty FatalBackgroundProperty = + DependencyProperty.Register("FatalBackground", typeof(Brush), typeof(NLogViewer), + new PropertyMetadata(Brushes.Black)); + + /// + /// The foreground for the fatal output + /// + [Category("NLogViewerColors")] + public Brush FatalForeground + { + get => (Brush) GetValue(FatalForegroundProperty); + set => SetValue(FatalForegroundProperty, value); + } + + /// + /// The DependencyProperty. + /// + public static readonly DependencyProperty FatalForegroundProperty = + DependencyProperty.Register("FatalForeground", typeof(Brush), typeof(NLogViewer), + new PropertyMetadata(Brushes.Yellow)); + + #endregion + + // ########################################################################################## + // NLogViewer + // ########################################################################################## + + #region NLogViewer + + /// + /// Is looking if any target with this name is configured and tries to link it + /// + [Category("NLogViewer")] + public string TargetName + { + get => (string)GetValue(TargetNameProperty); + set => SetValue(TargetNameProperty, value); + } + + /// + /// The DependencyProperty. + /// + public static readonly DependencyProperty TargetNameProperty = DependencyProperty.Register("TargetName", typeof(string), typeof(NLogViewer), new PropertyMetadata(null)); + + /// + /// Private DP to bind to the gui + /// + [Category("NLogViewer")] + public CollectionViewSource LogEvents + { + get => (CollectionViewSource) GetValue(LogEventsProperty); + private set => SetValue(LogEventsProperty, value); + } + + /// + /// The DependencyProperty. + /// + public static readonly DependencyProperty LogEventsProperty = DependencyProperty.Register("LogEvents", + typeof(CollectionViewSource), typeof(NLogViewer), new PropertyMetadata(null)); + + /// + /// Automatically scroll to the newest entry + /// + [Category("NLogViewer")] + public bool AutoScroll + { + get => (bool)GetValue(AutoScrollProperty); + set => SetValue(AutoScrollProperty, value); + } + + /// + /// The DependencyProperty. + /// + public static readonly DependencyProperty AutoScrollProperty = DependencyProperty.Register("AutoScroll", typeof(bool), typeof(NLogViewer), new PropertyMetadata(true, AutoScrollChangedCallback)); + + private static void AutoScrollChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs args) + { + if (d is NLogViewer instance) + { + instance.OnAutoScrollChanged(); + } + } + + protected virtual void OnAutoScrollChanged() + { + if (AutoScroll) + ListView?.ScrollToEnd(); + } + + /// + /// Delele all entries + /// + [Category("NLogViewer")] + public ICommand ClearCommand + { + get => (ICommand) GetValue(ClearCommandProperty); + set => SetValue(ClearCommandProperty, value); + } + + /// + /// The DependencyProperty. + /// + public static readonly DependencyProperty ClearCommandProperty = DependencyProperty.Register("ClearCommand", + typeof(ICommand), typeof(NLogViewer), new PropertyMetadata(null)); + + /// + /// Stop logging + /// + [Category("NLogViewer")] + public bool Pause + { + get => (bool)GetValue(PauseProperty); + set => SetValue(PauseProperty, value); + } + + /// + /// The DependencyProperty. + /// + public static readonly DependencyProperty PauseProperty = DependencyProperty.Register("Pause", typeof(bool), typeof(NLogViewer), new PropertyMetadata(false)); + + /// + /// The maximum number of entries before automatic cleaning is performed. There is a hysteresis of 100 entries which must be exceeded. + /// Example: is '1000'. Then after '1100' entries, everything until '1000' is deleted. + /// If set to '0' or less, it is deactivated + /// + [Category("NLogViewer")] + public int MaxCount + { + get => (int)GetValue(MaxCountProperty); + set => SetValue(MaxCountProperty, value); + } + + /// + /// The DependencyProperty. + /// + public static readonly DependencyProperty MaxCountProperty = DependencyProperty.Register("MaxCount", typeof(int), typeof(NLogViewer), new PropertyMetadata(5000)); + + + #endregion + + // ########################################################################################## + // Resolver + // ########################################################################################## + + #region Resolver + + /// + /// The to format the id + /// + [Category("NLogViewerResolver")] + public ILogEventInfoResolver IdResolver + { + get => (ILogEventInfoResolver)GetValue(IdResolverProperty); + set => SetValue(IdResolverProperty, value); + } + + /// + /// The DependencyProperty. + /// + public static readonly DependencyProperty IdResolverProperty = DependencyProperty.Register("IdResolver", typeof(ILogEventInfoResolver), typeof(NLogViewer), new PropertyMetadata(new IdResolver())); + + /// + /// The to format the timestamp output + /// + [Category("NLogViewerResolver")] + public ILogEventInfoResolver TimeStampResolver + { + get => (ILogEventInfoResolver)GetValue(TimeStampResolverProperty); + set => SetValue(TimeStampResolverProperty, value); + } + + /// + /// The DependencyProperty. + /// + public static readonly DependencyProperty TimeStampResolverProperty = DependencyProperty.Register("TimeStampResolver", typeof(ILogEventInfoResolver), typeof(NLogViewer), new PropertyMetadata(new TimeStampResolver())); + + /// + /// The to format the loggername + /// + [Category("NLogViewerResolver")] + public ILogEventInfoResolver LoggerNameResolver + { + get => (ILogEventInfoResolver)GetValue(LoggerNameResolverProperty); + set => SetValue(LoggerNameResolverProperty, value); + } + + /// + /// The DependencyProperty. + /// + public static readonly DependencyProperty LoggerNameResolverProperty = DependencyProperty.Register("LoggerNameResolver", typeof(ILogEventInfoResolver), typeof(NLogViewer), new PropertyMetadata(new LoggerNameResolver())); + + /// + /// The to format the message + /// + [Category("NLogViewerResolver")] + public ILogEventInfoResolver MessageResolver + { + get => (ILogEventInfoResolver)GetValue(MessageResolverProperty); + set => SetValue(MessageResolverProperty, value); + } + + /// + /// The DependencyProperty. + /// + public static readonly DependencyProperty MessageResolverProperty = DependencyProperty.Register("MessageResolver", typeof(ILogEventInfoResolver), typeof(NLogViewer), new PropertyMetadata(new MessageResolver())); + + #endregion + + + #endregion + + // ############################################################################################################################## + // Properties + // ############################################################################################################################## + + #region Properties + + // ########################################################################################## + // Public Properties + // ########################################################################################## + + + + // ########################################################################################## + // Private Properties + // ########################################################################################## + + private ObservableCollection _LogEventInfos { get; } = new ObservableCollection(); + private IDisposable _Subscription; + private Window _ParentWindow; + + #endregion + + // ############################################################################################################################## + // Constructor + // ############################################################################################################################## + + #region Constructor + + public NLogViewer() + { + InitializeComponent(); + DataContext = this; + + // save instance UID + Uid = GetHashCode().ToString(); + + if (DesignerProperties.GetIsInDesignMode(this)) + return; + + LogEvents = new CollectionViewSource {Source = _LogEventInfos}; + + Loaded += _OnLoaded; + Unloaded += _OnUnloaded; + ClearCommand = new ActionCommand(_LogEventInfos.Clear); + } + + private void _OnUnloaded(object sender, RoutedEventArgs e) + { + // look in logical and visual tree if the control has been removed + // If there is no parent window found before, we have a special case (https://github.com/dojo90/NLogViewer/issues/30) and just dispose it anyway + if (_ParentWindow.FindChildByUid(Uid) == null) + { + _Dispose(); + } + } + + private void _ParentWindowOnClosed(object sender, EventArgs e) + { + _Dispose(); + } + + private void _Dispose() + { + _Subscription?.Dispose(); + } + + private void _OnLoaded(object sender, RoutedEventArgs e) + { + // removed loaded handler to prevent duplicate subscribing + Loaded -= _OnLoaded; + + // add hook to parent window to dispose subscription + // use case: + // NLogViewer is used in a new window inside of a TabControl. If you switch the TabItems, + // the unloaded event is called and would dispose the subscription, even if the control is still alive. + if (Window.GetWindow(this) is { } window) + { + _ParentWindow = window; + _ParentWindow.Closed += _ParentWindowOnClosed; + } + + ListView.ScrollToEnd(); + var target = CacheTarget.GetInstance(targetName: TargetName); + + _Subscription = target.Cache.SubscribeOn(Scheduler.Default).Buffer(TimeSpan.FromMilliseconds(100)).Where (x => x.Any()).ObserveOn(new DispatcherSynchronizationContext(_ParentWindow.Dispatcher)).Subscribe(infos => + { + if (Pause) return; + using (LogEvents.DeferRefresh()) + { + foreach (LogEventInfo info in infos) + { + _LogEventInfos.Add(info); + } + if (MaxCount >= 0 & _LogEventInfos.Count - 100 > MaxCount) + { + for (int i = 0; i < _LogEventInfos.Count - MaxCount; i++) + { + _LogEventInfos.RemoveAt(0); + } + } + } + + if (AutoScroll) + { + ListView?.ScrollToEnd(); + } + }); + } + + #endregion + } +} diff --git a/FSI.Lib/NLogViewer/Resolver/ILogEventInfoResolver.cs b/FSI.Lib/NLogViewer/Resolver/ILogEventInfoResolver.cs new file mode 100644 index 0000000..ea0e2f2 --- /dev/null +++ b/FSI.Lib/NLogViewer/Resolver/ILogEventInfoResolver.cs @@ -0,0 +1,12 @@ +using NLog; + +namespace DJ.Resolver +{ + /// + /// Default interface to resolve a for your personal needs + /// + public interface ILogEventInfoResolver + { + string Resolve(LogEventInfo logEventInfo); + } +} diff --git a/FSI.Lib/NLogViewer/Resolver/IdResolver.cs b/FSI.Lib/NLogViewer/Resolver/IdResolver.cs new file mode 100644 index 0000000..e427d29 --- /dev/null +++ b/FSI.Lib/NLogViewer/Resolver/IdResolver.cs @@ -0,0 +1,12 @@ +using NLog; + +namespace DJ.Resolver +{ + public class IdResolver : ILogEventInfoResolver + { + public string Resolve(LogEventInfo logEventInfo) + { + return logEventInfo.SequenceID.ToString(); + } + } +} \ No newline at end of file diff --git a/FSI.Lib/NLogViewer/Resolver/LoggerNameResolver.cs b/FSI.Lib/NLogViewer/Resolver/LoggerNameResolver.cs new file mode 100644 index 0000000..c8773a8 --- /dev/null +++ b/FSI.Lib/NLogViewer/Resolver/LoggerNameResolver.cs @@ -0,0 +1,12 @@ +using NLog; + +namespace DJ.Resolver +{ + public class LoggerNameResolver : ILogEventInfoResolver + { + public string Resolve(LogEventInfo logEventInfo) + { + return logEventInfo.LoggerName; + } + } +} \ No newline at end of file diff --git a/FSI.Lib/NLogViewer/Resolver/MessageResolver.cs b/FSI.Lib/NLogViewer/Resolver/MessageResolver.cs new file mode 100644 index 0000000..e6907e7 --- /dev/null +++ b/FSI.Lib/NLogViewer/Resolver/MessageResolver.cs @@ -0,0 +1,21 @@ +using System.Text; +using NLog; + +namespace DJ.Resolver +{ + public class MessageResolver : ILogEventInfoResolver + { + public string Resolve(LogEventInfo logEventInfo) + { + StringBuilder builder = new StringBuilder(); + builder.Append(logEventInfo.FormattedMessage); + + if (logEventInfo.Exception != null) + { + builder.AppendLine().Append(logEventInfo.Exception); + } + + return builder.ToString(); + } + } +} \ No newline at end of file diff --git a/FSI.Lib/NLogViewer/Resolver/TimeStampResolver.cs b/FSI.Lib/NLogViewer/Resolver/TimeStampResolver.cs new file mode 100644 index 0000000..45ac642 --- /dev/null +++ b/FSI.Lib/NLogViewer/Resolver/TimeStampResolver.cs @@ -0,0 +1,12 @@ +using NLog; + +namespace DJ.Resolver +{ + public class TimeStampResolver : ILogEventInfoResolver + { + public string Resolve(LogEventInfo logEventInfo) + { + return logEventInfo.TimeStamp.ToString("dd-MM-yyyy hh:mm:ss.fff"); + } + } +} \ No newline at end of file diff --git a/FSI.Lib/NLogViewer/ScrollingHelper.cs b/FSI.Lib/NLogViewer/ScrollingHelper.cs new file mode 100644 index 0000000..ee70112 --- /dev/null +++ b/FSI.Lib/NLogViewer/ScrollingHelper.cs @@ -0,0 +1,44 @@ +using System; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Media; + +namespace DJ +{ + public static class ScrollingHelper + { + public static void ScrollToEnd(this ListView listView) + { + var scrollViewer = GetDescendantByType(listView, typeof(ScrollViewer)) as ScrollViewer; + scrollViewer?.ScrollToEnd(); + } + + public static Visual GetDescendantByType(Visual element, Type type) + { + if (element != null) + { + if (element.GetType() != type) + { + Visual foundElement = null; + (element as FrameworkElement)?.ApplyTemplate(); + + for (var i = 0; i < VisualTreeHelper.GetChildrenCount(element); i++) + { + var visual = VisualTreeHelper.GetChild(element, i) as Visual; + foundElement = GetDescendantByType(visual, type); + if (foundElement != null) + { + break; + } + } + + return foundElement; + } + + return element; + } + + return null; + } + } +} \ No newline at end of file diff --git a/FSI.Lib/NLogViewer/Targets/CacheTarget.cs b/FSI.Lib/NLogViewer/Targets/CacheTarget.cs new file mode 100644 index 0000000..103f1f5 --- /dev/null +++ b/FSI.Lib/NLogViewer/Targets/CacheTarget.cs @@ -0,0 +1,93 @@ +using System; +using System.Linq; +using System.Reactive.Linq; +using System.Reactive.Subjects; +using DJ.Helper; +using NLog; +using NLog.Config; +using NLog.Targets; + +namespace DJ.Targets +{ + [Target(nameof(CacheTarget))] + public class CacheTarget : Target + { + /// + /// Look in the NLog.config if any target is already defined and returns it, otherwise a new one is registered + /// + /// The maximum entries which should be buffered. Is only used if no target is defined + /// The name of the target you want to link with + /// + public static CacheTarget GetInstance(int defaultMaxCount = 0, string targetName = null) + { + if(LogManager.Configuration == null) + LogManager.Configuration = new LoggingConfiguration(); + + var predicate = PredicateBuilder.True().And(t => t is CacheTarget); + if (!string.IsNullOrEmpty(targetName)) + { + predicate = predicate.And(t => t.Name.Equals(targetName, StringComparison.CurrentCultureIgnoreCase) ||t.Name.Equals($"{targetName}_wrapped", StringComparison.CurrentCultureIgnoreCase)); + } + + var target = (CacheTarget)LogManager.Configuration.AllTargets.FirstOrDefault(predicate.Compile()); + if (target == null) + { + target = new CacheTarget { MaxCount = defaultMaxCount, Name = targetName ?? nameof(CacheTarget)}; + LogManager.Configuration.AddTarget(target.Name, target); + LogManager.Configuration.LoggingRules.Insert(0, new LoggingRule("*", LogLevel.FromString("Trace"), target)); + LogManager.ReconfigExistingLoggers(); + } + return target; + } + + // ############################################################################################################################## + // Properties + // ############################################################################################################################## + + #region Properties + + // ########################################################################################## + // Public Properties + // ########################################################################################## + + /// + /// The maximum amount of entries held in buffer/cache + /// + public int MaxCount { get; set; } = 100; + + public IObservable Cache => _CacheSubject.AsObservable(); + private readonly ReplaySubject _CacheSubject; + + // ########################################################################################## + // Private Properties + // ########################################################################################## + + #endregion + + // ############################################################################################################################## + // Constructor + // ############################################################################################################################## + + #region Constructor + + public CacheTarget() + { + _CacheSubject = new ReplaySubject(MaxCount); + } + + #endregion + + // ############################################################################################################################## + // override + // ############################################################################################################################## + + #region override + + protected override void Write(LogEventInfo logEvent) + { + _CacheSubject.OnNext(logEvent); + } + + #endregion + } +} \ No newline at end of file diff --git a/FSI.Lib/NLogViewer/XamlMultiValueConverter/ILogEventResolverToStringConverter.cs b/FSI.Lib/NLogViewer/XamlMultiValueConverter/ILogEventResolverToStringConverter.cs new file mode 100644 index 0000000..e1bf42f --- /dev/null +++ b/FSI.Lib/NLogViewer/XamlMultiValueConverter/ILogEventResolverToStringConverter.cs @@ -0,0 +1,23 @@ +using System; +using System.Globalization; +using System.Windows.Data; +using DJ.Resolver; +using NLog; + +namespace DJ.XamlMultiValueConverter +{ + public class ILogEventResolverToStringConverter : IMultiValueConverter + { + public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) + { + if (values[0] is LogEventInfo logEventInfo && values[1] is ILogEventInfoResolver resolver) + return resolver.Resolve(logEventInfo); + return "####"; + } + + public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } + } +} diff --git a/FSI.Lib/NLogViewer/global.json b/FSI.Lib/NLogViewer/global.json new file mode 100644 index 0000000..f45c840 --- /dev/null +++ b/FSI.Lib/NLogViewer/global.json @@ -0,0 +1,6 @@ +{ + "sdk": { + "version": "6.0.101", + "rollForward": "disable" + } +} \ No newline at end of file