Initial check-in
This commit is contained in:
1 parent
24578bd3f0
commit
b1e8a35899
118 files changed
+18332
-43
No files matched your search
@@ -0,0 +1,63 @@
|
||||
###############################################################################
|
||||
# Set default behavior to automatically normalize line endings.
|
||||
###############################################################################
|
||||
* text=auto
|
||||
|
||||
###############################################################################
|
||||
# Set default behavior for command prompt diff.
|
||||
#
|
||||
# This is need for earlier builds of msysgit that does not have it on by
|
||||
# default for csharp files.
|
||||
# Note: This is only used by command line
|
||||
###############################################################################
|
||||
#*.cs diff=csharp
|
||||
|
||||
###############################################################################
|
||||
# Set the merge driver for project and solution files
|
||||
#
|
||||
# Merging from the command prompt will add diff markers to the files if there
|
||||
# are conflicts (Merging from VS is not affected by the settings below, in VS
|
||||
# the diff markers are never inserted). Diff markers may cause the following
|
||||
# file extensions to fail to load in VS. An alternative would be to treat
|
||||
# these files as binary and thus will always conflict and require user
|
||||
# intervention with every merge. To do so, just uncomment the entries below
|
||||
###############################################################################
|
||||
#*.sln merge=binary
|
||||
#*.csproj merge=binary
|
||||
#*.vbproj merge=binary
|
||||
#*.vcxproj merge=binary
|
||||
#*.vcproj merge=binary
|
||||
#*.dbproj merge=binary
|
||||
#*.fsproj merge=binary
|
||||
#*.lsproj merge=binary
|
||||
#*.wixproj merge=binary
|
||||
#*.modelproj merge=binary
|
||||
#*.sqlproj merge=binary
|
||||
#*.wwaproj merge=binary
|
||||
|
||||
###############################################################################
|
||||
# behavior for image files
|
||||
#
|
||||
# image files are treated as binary by default.
|
||||
###############################################################################
|
||||
#*.jpg binary
|
||||
#*.png binary
|
||||
#*.gif binary
|
||||
|
||||
###############################################################################
|
||||
# diff behavior for common document formats
|
||||
#
|
||||
# Convert binary document formats to text before diffing them. This feature
|
||||
# is only available from the command line. Turn it on by uncommenting the
|
||||
# entries below.
|
||||
###############################################################################
|
||||
#*.doc diff=astextplain
|
||||
#*.DOC diff=astextplain
|
||||
#*.docx diff=astextplain
|
||||
#*.DOCX diff=astextplain
|
||||
#*.dot diff=astextplain
|
||||
#*.DOT diff=astextplain
|
||||
#*.pdf diff=astextplain
|
||||
#*.PDF diff=astextplain
|
||||
#*.rtf diff=astextplain
|
||||
#*.RTF diff=astextplain
|
||||
+9
-43
@@ -1,8 +1,12 @@
|
||||
# ---> VisualStudio
|
||||
## Ignore Visual Studio temporary files, build results, and
|
||||
## files generated by popular Visual Studio add-ons.
|
||||
##
|
||||
## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore
|
||||
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
|
||||
|
||||
Source/LogDashboard/_Deployment
|
||||
Source/LogDashboard/Nuget/cache
|
||||
|
||||
Thumbs.db
|
||||
|
||||
# User-specific files
|
||||
*.rsuser
|
||||
@@ -30,6 +34,7 @@ x86/
|
||||
bld/
|
||||
[Bb]in/
|
||||
[Oo]bj/
|
||||
[Oo]ut/
|
||||
[Ll]og/
|
||||
[Ll]ogs/
|
||||
|
||||
@@ -83,8 +88,6 @@ StyleCopReport.xml
|
||||
*.pgc
|
||||
*.pgd
|
||||
*.rsp
|
||||
# but not Directory.Build.rsp, as it configures directory-level build defaults
|
||||
!Directory.Build.rsp
|
||||
*.sbr
|
||||
*.tlb
|
||||
*.tli
|
||||
@@ -93,7 +96,6 @@ StyleCopReport.xml
|
||||
*.tmp_proj
|
||||
*_wpftmp.csproj
|
||||
*.log
|
||||
*.tlog
|
||||
*.vspscc
|
||||
*.vssscc
|
||||
.builds
|
||||
@@ -196,7 +198,7 @@ publish/
|
||||
PublishScripts/
|
||||
|
||||
# NuGet Packages
|
||||
*.nupkg
|
||||
#*.nupkg
|
||||
# NuGet Symbol Packages
|
||||
*.snupkg
|
||||
# The packages folder can be ignored because of Package Restore
|
||||
@@ -297,17 +299,6 @@ node_modules/
|
||||
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
|
||||
*.vbw
|
||||
|
||||
# Visual Studio 6 auto-generated project file (contains which files were open etc.)
|
||||
*.vbp
|
||||
|
||||
# Visual Studio 6 workspace and project file (working project files containing files to include in project)
|
||||
*.dsw
|
||||
*.dsp
|
||||
|
||||
# Visual Studio 6 technical files
|
||||
*.ncb
|
||||
*.aps
|
||||
|
||||
# Visual Studio LightSwitch build output
|
||||
**/*.HTMLClient/GeneratedArtifacts
|
||||
**/*.DesktopClient/GeneratedArtifacts
|
||||
@@ -364,9 +355,6 @@ ASALocalRun/
|
||||
# Local History for Visual Studio
|
||||
.localhistory/
|
||||
|
||||
# Visual Studio History (VSHistory) files
|
||||
.vshistory/
|
||||
|
||||
# BeatPulse healthcheck temp database
|
||||
healthchecksdb
|
||||
|
||||
@@ -377,26 +365,4 @@ MigrationBackup/
|
||||
.ionide/
|
||||
|
||||
# Fody - auto-generated XML schema
|
||||
FodyWeavers.xsd
|
||||
|
||||
# VS Code files for those working on multiple tools
|
||||
.vscode/*
|
||||
!.vscode/settings.json
|
||||
!.vscode/tasks.json
|
||||
!.vscode/launch.json
|
||||
!.vscode/extensions.json
|
||||
*.code-workspace
|
||||
|
||||
# Local History for Visual Studio Code
|
||||
.history/
|
||||
|
||||
# Windows Installer files from build outputs
|
||||
*.cab
|
||||
*.msi
|
||||
*.msix
|
||||
*.msm
|
||||
*.msp
|
||||
|
||||
# JetBrains Rider
|
||||
*.sln.iml
|
||||
|
||||
FodyWeavers.xsd
|
||||
@@ -0,0 +1,110 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<!--
|
||||
App.config
|
||||
12/4/2023
|
||||
|
||||
RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
COMPANY.
|
||||
|
||||
THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
|
||||
UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
|
||||
WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
PENALTIES.
|
||||
|
||||
DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
RECONSTRUCTION OF THE DOCUMENT.
|
||||
POC: Alex Kravchenko (1118268)
|
||||
-->
|
||||
<configuration>
|
||||
<configSections>
|
||||
<section name="nlog" type="NLog.Config.ConfigSectionHandler, NLog"/>
|
||||
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
|
||||
<section name="Raytheon.LogDashboard.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
|
||||
</sectionGroup>
|
||||
</configSections>
|
||||
<startup>
|
||||
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2"/>
|
||||
</startup>
|
||||
|
||||
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" autoReload="true">
|
||||
<targets>
|
||||
<target fileName="${logger}.txt"
|
||||
xsi:type="File"
|
||||
name="file"
|
||||
layout="${date:format=MM/dd/yyyy hh.mm.ss} ${message}"
|
||||
archiveAboveSize="100000000"/>
|
||||
<target name="fileLog" type="AsyncWrapper" queueLimit="5000" overflowAction="Block">
|
||||
<target type="File" fileName="${specialfolder:folder=MyDocuments}/LogDashboard/logs/${shortdate}.txt"
|
||||
layout="${longdate};${level};${threadid};${callsite};${logger};${message};${exception:format=tostring}"
|
||||
archiveFileName="${specialfolder:folder=MyDocuments}/LogDashboard/logs/archive/{#}.zip"
|
||||
archiveDateFormat="MM-dd-yyyy"
|
||||
archiveNumbering="Date"
|
||||
enableArchiveFileCompression="True"
|
||||
maxArchiveFiles="7"
|
||||
archiveEvery="Day"/>
|
||||
</target>
|
||||
</targets>
|
||||
<rules>
|
||||
<logger name="*" minlevel="Debug" writeTo="fileLog"/>
|
||||
</rules>
|
||||
</nlog>
|
||||
<runtime>
|
||||
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="System.Windows.Interactivity" publicKeyToken="31bf3856ad364e35" culture="neutral"/>
|
||||
<bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0"/>
|
||||
</dependentAssembly>
|
||||
</assemblyBinding>
|
||||
</runtime>
|
||||
<userSettings>
|
||||
<Raytheon.LogDashboard.Properties.Settings>
|
||||
<setting name="CurrentWindowHeight" serializeAs="String">
|
||||
<value>600</value>
|
||||
</setting>
|
||||
<setting name="PreviousWindowHeight" serializeAs="String">
|
||||
<value>600</value>
|
||||
</setting>
|
||||
<setting name="CurrentWindowWidth" serializeAs="String">
|
||||
<value>800</value>
|
||||
</setting>
|
||||
<setting name="PreviousWindowWidth" serializeAs="String">
|
||||
<value>800</value>
|
||||
</setting>
|
||||
<setting name="CurrentWindowLeft" serializeAs="String">
|
||||
<value>100</value>
|
||||
</setting>
|
||||
<setting name="PreviousWindowLeft" serializeAs="String">
|
||||
<value>100</value>
|
||||
</setting>
|
||||
<setting name="CurrentWindowTop" serializeAs="String">
|
||||
<value>100</value>
|
||||
</setting>
|
||||
<setting name="PreviousWindowTop" serializeAs="String">
|
||||
<value>100</value>
|
||||
</setting>
|
||||
<setting name="SettingsPath" serializeAs="String">
|
||||
<value></value>
|
||||
</setting>
|
||||
</Raytheon.LogDashboard.Properties.Settings>
|
||||
</userSettings>
|
||||
</configuration>
|
||||
@@ -0,0 +1,59 @@
|
||||
<!--
|
||||
App.xaml
|
||||
12/4/2023
|
||||
|
||||
RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
COMPANY.
|
||||
|
||||
THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
|
||||
UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
|
||||
WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
PENALTIES.
|
||||
|
||||
DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
RECONSTRUCTION OF THE DOCUMENT.
|
||||
POC: Alex Kravchenko (1118268)
|
||||
-->
|
||||
<Application x:Class="LogDashboard.App"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
d1p1:Ignorable="d"
|
||||
xmlns:d1p1="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
StartupUri="View/MainWindow.xaml"
|
||||
>
|
||||
<Application.Resources>
|
||||
<ResourceDictionary>
|
||||
<ResourceDictionary.MergedDictionaries>
|
||||
<!-- MahApps.Metro resource dictionaries. Make sure that all file names are Case Sensitive! -->
|
||||
<ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Controls.xaml" />
|
||||
<ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Fonts.xaml" />
|
||||
<!-- Theme setting -->
|
||||
<ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Themes/Light.Blue.xaml" />
|
||||
|
||||
</ResourceDictionary.MergedDictionaries>
|
||||
|
||||
<vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" xmlns:vm="clr-namespace:Raytheon.LogDashboard.ViewModel" />
|
||||
<vm:LogDashViewModelLocator x:Key="LogDashLocator" d:IsDataSource="True" xmlns:vm="clr-namespace:Raytheon.LogDashboard.ViewModel;assembly=Raytheon.LogDashboardLib" />
|
||||
</ResourceDictionary>
|
||||
</Application.Resources>
|
||||
</Application>
|
||||
@@ -0,0 +1,221 @@
|
||||
//******************************************************************************//
|
||||
// App.xaml.cs
|
||||
// 12/4/2023
|
||||
//
|
||||
// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
// PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
// AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
// UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
// RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
// CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
// OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
// COMPANY.
|
||||
//
|
||||
// THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
//
|
||||
// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
//
|
||||
// WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
// EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
// BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
// 120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
// 730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
// OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
// LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
// BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
// APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
// PENALTIES.
|
||||
//
|
||||
// DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
// FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
// INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
// DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
// RECONSTRUCTION OF THE DOCUMENT.
|
||||
// POC: Alex Kravchenko (1118268)
|
||||
//******************************************************************************//
|
||||
using Microsoft.Win32;
|
||||
using NLog;
|
||||
using Raytheon.LogDashboard.Helpers;
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using System.Windows;
|
||||
using System.IO;
|
||||
using Raytheon.LogDashboard.View;
|
||||
using GalaSoft.MvvmLight.Messaging;
|
||||
using System.Reflection;
|
||||
|
||||
namespace LogDashboard
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for App.xaml
|
||||
/// </summary>
|
||||
public partial class App : Application
|
||||
{
|
||||
private static readonly Logger logger = LogManager.GetCurrentClassLogger();
|
||||
|
||||
public static bool IsManualStartup { get; private set; } = false;
|
||||
public ResourceDictionary ThemeDictionary => Resources.MergedDictionaries[1];
|
||||
|
||||
public void ChangeTheme(Uri uri)
|
||||
{
|
||||
ThemeDictionary.MergedDictionaries[1] = new ResourceDictionary { Source = uri };
|
||||
}
|
||||
|
||||
static Mutex mutex = new Mutex(true, "{8F6F0AC4-B9A1-45fd-A8CF-72F04E6BDE8F}");
|
||||
|
||||
[STAThread]
|
||||
protected override void OnStartup(StartupEventArgs e)
|
||||
{
|
||||
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
|
||||
Current.DispatcherUnhandledException += Current_DispatcherUnhandledException;
|
||||
|
||||
if(e.Args.Any(x => (x.EndsWith(".txt") || x.EndsWith(".log")) && File.Exists(x)))
|
||||
{
|
||||
IsManualStartup = true;
|
||||
|
||||
try
|
||||
{
|
||||
if(!mutex.WaitOne(TimeSpan.Zero, true))
|
||||
{
|
||||
Process proc = Process.GetCurrentProcess();
|
||||
string processName = proc.ProcessName.Replace(".vshost", "");
|
||||
var runningProcess = Process.GetProcesses()
|
||||
.FirstOrDefault(x => (x.ProcessName == processName || x.ProcessName == proc.ProcessName || x.ProcessName == proc.ProcessName + ".vshost") && x.Id != proc.Id);
|
||||
|
||||
if(runningProcess == null)
|
||||
{
|
||||
App app = new App();
|
||||
app.InitializeComponent();
|
||||
MainWindow window = new MainWindow();
|
||||
Raytheon.LogDashboard.View.MainWindow.HandleParameter(e.Args);
|
||||
app.Run(window);
|
||||
return;
|
||||
}
|
||||
|
||||
UnsafeNative.SendMessage(runningProcess.MainWindowHandle, string.Join(" ", e.Args));
|
||||
|
||||
Environment.Exit(0);
|
||||
}
|
||||
}
|
||||
catch(Exception exception)
|
||||
{
|
||||
logger.Warn(exception, "OnStartup check exception (open with arguments)");
|
||||
}
|
||||
}
|
||||
|
||||
string assemblyFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
|
||||
string logDashboardConfigFilePath = Path.Combine(assemblyFolder, "LogDashboard.xml");
|
||||
// load settings from configuration file
|
||||
Raytheon.LogDashboard.Model.Settings.SetInstance(logDashboardConfigFilePath).Load();
|
||||
|
||||
if(Raytheon.LogDashboard.Model.Settings.Instance.OnlyOneAppInstance)
|
||||
{
|
||||
try
|
||||
{
|
||||
if(mutex.WaitOne(TimeSpan.Zero, true))
|
||||
{
|
||||
mutex.ReleaseMutex();
|
||||
}
|
||||
else
|
||||
{
|
||||
logger.Trace("OnStartup: one instance of Log Viewer already started");
|
||||
Messenger.Default.Send("OnStartup: one instance of Log Viewer already started", "DisplayCustomMessage");
|
||||
Environment.Exit(0);
|
||||
}
|
||||
}
|
||||
catch(Exception exception)
|
||||
{
|
||||
logger.Warn(exception, "OnStartup check exception");
|
||||
}
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
if(!IsAssociated())
|
||||
{
|
||||
string filePath = Process.GetCurrentProcess().MainModule.FileName;
|
||||
|
||||
SetAssociation(".txt", "LogDashboard", filePath);
|
||||
SetAssociation(".log", "LogDashboard", filePath);
|
||||
SetAssociation(".csv", "LogDashboard", filePath);
|
||||
}
|
||||
}
|
||||
catch(Exception exception)
|
||||
{
|
||||
logger.Warn(exception, "OnStartup set file association exception");
|
||||
}
|
||||
|
||||
base.OnStartup(e);
|
||||
}
|
||||
private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
|
||||
{
|
||||
logger.Fatal($"Unhandled exception {e.ExceptionObject as Exception}");
|
||||
Environment.Exit(1);
|
||||
}
|
||||
|
||||
private void Current_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
|
||||
{
|
||||
logger.Fatal($"Unhandled Exception: {e.Exception}");
|
||||
Environment.Exit(2);
|
||||
}
|
||||
|
||||
#region File Association
|
||||
|
||||
private bool IsAssociated()
|
||||
{
|
||||
return Registry.CurrentUser.OpenSubKey(@"Software\Classes\LogViewer", false) != null;
|
||||
}
|
||||
|
||||
[DllImport("Shell32.dll")]
|
||||
private static extern int SHChangeNotify(int eventId, int flags, IntPtr item1, IntPtr item2);
|
||||
|
||||
private const int SHCNE_ASSOCCHANGED = 0x8000000;
|
||||
private const int SHCNF_FLUSH = 0x1000;
|
||||
|
||||
private void SetAssociation(string extension, string progId, string applicationFilePath)
|
||||
{
|
||||
bool madeChanges = false;
|
||||
|
||||
madeChanges |= SetKeyDefaultValue($@"Software\Classes\{progId}\shell\open\command", "\"" + applicationFilePath + "\" \"%1\"");
|
||||
madeChanges |= SetProgIdValue($@"Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\{extension}\OpenWithProgids", progId);
|
||||
|
||||
if(madeChanges)
|
||||
{
|
||||
SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_FLUSH, IntPtr.Zero, IntPtr.Zero);
|
||||
}
|
||||
}
|
||||
|
||||
private bool SetProgIdValue(string path, string progId)
|
||||
{
|
||||
using(var key = Registry.CurrentUser.CreateSubKey(path))
|
||||
{
|
||||
if(key.GetValueNames().All(x => x != progId))
|
||||
{
|
||||
key.SetValue(progId, Encoding.Unicode.GetBytes(string.Empty), RegistryValueKind.Binary);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private bool SetKeyDefaultValue(string keyPath, string value)
|
||||
{
|
||||
using(var key = Registry.CurrentUser.CreateSubKey(keyPath))
|
||||
{
|
||||
if(key.GetValue(null) as string != value)
|
||||
{
|
||||
key.SetValue(null, value);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,101 @@
|
||||
//******************************************************************************//
|
||||
// UnsafeNative.cs
|
||||
// 12/4/2023
|
||||
//
|
||||
// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
// PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
// AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
// UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
// RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
// CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
// OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
// COMPANY.
|
||||
//
|
||||
// THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
//
|
||||
// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
//
|
||||
// WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
// EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
// BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
// 120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
// 730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
// OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
// LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
// BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
// APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
// PENALTIES.
|
||||
//
|
||||
// DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
// FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
// INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
// DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
// RECONSTRUCTION OF THE DOCUMENT.
|
||||
// POC: Alex Kravchenko (1118268)
|
||||
//******************************************************************************//
|
||||
|
||||
// Ignore Spelling: COPYDATA
|
||||
|
||||
using System;
|
||||
using System.ComponentModel;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text;
|
||||
|
||||
namespace Raytheon.LogDashboard.Helpers
|
||||
{
|
||||
internal static class UnsafeNative
|
||||
{
|
||||
public const int WM_COPYDATA = 0x004A;
|
||||
|
||||
public static string GetMessage(int message, IntPtr lParam)
|
||||
{
|
||||
if (message == WM_COPYDATA)
|
||||
{
|
||||
try
|
||||
{
|
||||
var data = Marshal.PtrToStructure<CopyDataStruct>(lParam);
|
||||
string result = string.Copy(data.lpData);
|
||||
return result;
|
||||
}
|
||||
catch
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public static void SendMessage(IntPtr hwnd, string message)
|
||||
{
|
||||
byte[] messageBytes = Encoding.Unicode.GetBytes(message); /* ANSII encoding */
|
||||
CopyDataStruct data = new CopyDataStruct
|
||||
{
|
||||
dwData = IntPtr.Zero,
|
||||
lpData = message,
|
||||
cbData = messageBytes.Length + 1 /* +1 because of \0 string termination */
|
||||
};
|
||||
|
||||
if (SendMessage(hwnd, WM_COPYDATA, IntPtr.Zero, ref data) != 0)
|
||||
{
|
||||
throw new Win32Exception(Marshal.GetLastWin32Error());
|
||||
}
|
||||
}
|
||||
|
||||
[DllImport("user32.dll")]
|
||||
public static extern bool SetForegroundWindow(IntPtr hWnd);
|
||||
|
||||
[DllImport("User32.dll", EntryPoint = "SendMessage")]
|
||||
private static extern int SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, ref CopyDataStruct lParam);
|
||||
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
private struct CopyDataStruct
|
||||
{
|
||||
public IntPtr dwData;
|
||||
public int cbData;
|
||||
|
||||
[MarshalAs(UnmanagedType.LPWStr)]
|
||||
public string lpData;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,105 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net48</TargetFramework>
|
||||
<AssemblyName>Raytheon.LogDashboard</AssemblyName>
|
||||
<RootNamespace>Raytheon.LogDashboard</RootNamespace>
|
||||
<Company>Raytheon Technologies</Company>
|
||||
<Product>Logging Dashboard Application</Product>
|
||||
<Authors>Specialty Engineering</Authors>
|
||||
<Copyright>Raytheon Technologies</Copyright>
|
||||
<Version>1.3.10</Version>
|
||||
<AssemblyVersion>$(Version)</AssemblyVersion>
|
||||
<FileVersion>$(Version)</FileVersion>
|
||||
<OutputType>WinExe</OutputType>
|
||||
<UseWPF>true</UseWPF>
|
||||
<ApplicationIcon>Resources\LogDashboard.ico</ApplicationIcon>
|
||||
<DeploymentFolder>$(SolutionDir)_Deployment\</DeploymentFolder>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<None Remove="Resources\rt_logo_30h.png" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Content Include="Resources\LogDashboard.ico">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</Content>
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="MahApps.Metro" Version="2.4.10" />
|
||||
<PackageReference Include="MahApps.Metro.Resources" Version="0.6.1" />
|
||||
<PackageReference Include="MvvmLight" Version="5.4.1.1" />
|
||||
<PackageReference Include="NLog" Version="5.0.0" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\LogDashboard\LogDashboard.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Reference Include="PresentationCore" />
|
||||
<Reference Include="PresentationFramework" />
|
||||
<Reference Include="System.Deployment" />
|
||||
<Reference Include="System.Xml" />
|
||||
<Reference Include="System.Xml.Linq" />
|
||||
<Reference Include="System.Windows.Forms" />
|
||||
<Reference Include="System.Windows.Interactivity" />
|
||||
<Reference Include="System.ServiceModel" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Compile Update="Properties\Settings.Designer.cs">
|
||||
<DesignTimeSharedInput>True</DesignTimeSharedInput>
|
||||
<AutoGen>True</AutoGen>
|
||||
<DependentUpon>Settings.settings</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Update="Resources\Resource1.Designer.cs">
|
||||
<DesignTime>True</DesignTime>
|
||||
<AutoGen>True</AutoGen>
|
||||
<DependentUpon>Resource1.resx</DependentUpon>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Resource Include="Resources\rt_logo_30h.png" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<EmbeddedResource Update="Resources\Resource1.resx">
|
||||
<Generator>ResXFileCodeGenerator</Generator>
|
||||
<LastGenOutput>Resource1.Designer.cs</LastGenOutput>
|
||||
</EmbeddedResource>
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<None Update="Properties\Settings.settings">
|
||||
<Generator>SettingsSingleFileGenerator</Generator>
|
||||
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
|
||||
</None>
|
||||
<None Update="Properties\Resources.resx">
|
||||
<Generator>SettingsSingleFileGenerator</Generator>
|
||||
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
|
||||
</None>
|
||||
<None Update="Properties\Locals.resx">
|
||||
<Generator>SettingsSingleFileGenerator</Generator>
|
||||
<LastGenOutput>Locals.Designer.cs</LastGenOutput>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
|
||||
|
||||
<Target Name="CopyFilesToDeploymentDir" AfterTargets="AfterBuild">
|
||||
<ItemGroup>
|
||||
<FILES_1 Include="$(OutDir)*.dll" />
|
||||
<FILES_2 Include="$(TargetPath)" />
|
||||
</ItemGroup>
|
||||
<Copy SourceFiles="@(FILES_1)" DestinationFolder="$(DeploymentFolder)" />
|
||||
<Copy SourceFiles="@(FILES_2)" DestinationFolder="$(DeploymentFolder)" />
|
||||
</Target>
|
||||
|
||||
<Target Name="ProjClean" AfterTargets="AfterClean">
|
||||
<RemoveDir Directories="$(DeploymentFolder)" />
|
||||
</Target>
|
||||
|
||||
</Project>
|
||||
@@ -0,0 +1,134 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
// Runtime Version:4.0.30319.42000
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
namespace Raytheon.LogDashboard.Properties {
|
||||
|
||||
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.13.0.0")]
|
||||
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
|
||||
|
||||
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
|
||||
|
||||
public static Settings Default {
|
||||
get {
|
||||
return defaultInstance;
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("600")]
|
||||
public double CurrentWindowHeight {
|
||||
get {
|
||||
return ((double)(this["CurrentWindowHeight"]));
|
||||
}
|
||||
set {
|
||||
this["CurrentWindowHeight"] = value;
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("600")]
|
||||
public double PreviousWindowHeight {
|
||||
get {
|
||||
return ((double)(this["PreviousWindowHeight"]));
|
||||
}
|
||||
set {
|
||||
this["PreviousWindowHeight"] = value;
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("800")]
|
||||
public double CurrentWindowWidth {
|
||||
get {
|
||||
return ((double)(this["CurrentWindowWidth"]));
|
||||
}
|
||||
set {
|
||||
this["CurrentWindowWidth"] = value;
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("800")]
|
||||
public double PreviousWindowWidth {
|
||||
get {
|
||||
return ((double)(this["PreviousWindowWidth"]));
|
||||
}
|
||||
set {
|
||||
this["PreviousWindowWidth"] = value;
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("100")]
|
||||
public double CurrentWindowLeft {
|
||||
get {
|
||||
return ((double)(this["CurrentWindowLeft"]));
|
||||
}
|
||||
set {
|
||||
this["CurrentWindowLeft"] = value;
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("100")]
|
||||
public double PreviousWindowLeft {
|
||||
get {
|
||||
return ((double)(this["PreviousWindowLeft"]));
|
||||
}
|
||||
set {
|
||||
this["PreviousWindowLeft"] = value;
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("100")]
|
||||
public double CurrentWindowTop {
|
||||
get {
|
||||
return ((double)(this["CurrentWindowTop"]));
|
||||
}
|
||||
set {
|
||||
this["CurrentWindowTop"] = value;
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("100")]
|
||||
public double PreviousWindowTop {
|
||||
get {
|
||||
return ((double)(this["PreviousWindowTop"]));
|
||||
}
|
||||
set {
|
||||
this["PreviousWindowTop"] = value;
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("./LogDashboard.xml")]
|
||||
public string SettingsPath {
|
||||
get {
|
||||
return ((string)(this["SettingsPath"]));
|
||||
}
|
||||
set {
|
||||
this["SettingsPath"] = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="Raytheon.LogDashboard.Properties" GeneratedClassName="Settings">
|
||||
<Profiles />
|
||||
<Settings>
|
||||
<Setting Name="CurrentWindowHeight" Type="System.Double" Scope="User">
|
||||
<Value Profile="(Default)">600</Value>
|
||||
</Setting>
|
||||
<Setting Name="PreviousWindowHeight" Type="System.Double" Scope="User">
|
||||
<Value Profile="(Default)">600</Value>
|
||||
</Setting>
|
||||
<Setting Name="CurrentWindowWidth" Type="System.Double" Scope="User">
|
||||
<Value Profile="(Default)">800</Value>
|
||||
</Setting>
|
||||
<Setting Name="PreviousWindowWidth" Type="System.Double" Scope="User">
|
||||
<Value Profile="(Default)">800</Value>
|
||||
</Setting>
|
||||
<Setting Name="CurrentWindowLeft" Type="System.Double" Scope="User">
|
||||
<Value Profile="(Default)">100</Value>
|
||||
</Setting>
|
||||
<Setting Name="PreviousWindowLeft" Type="System.Double" Scope="User">
|
||||
<Value Profile="(Default)">100</Value>
|
||||
</Setting>
|
||||
<Setting Name="CurrentWindowTop" Type="System.Double" Scope="User">
|
||||
<Value Profile="(Default)">100</Value>
|
||||
</Setting>
|
||||
<Setting Name="PreviousWindowTop" Type="System.Double" Scope="User">
|
||||
<Value Profile="(Default)">100</Value>
|
||||
</Setting>
|
||||
<Setting Name="SettingsPath" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)">./LogDashboard.xml</Value>
|
||||
</Setting>
|
||||
</Settings>
|
||||
</SettingsFile>
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 41 KiB |
@@ -0,0 +1,73 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
// Runtime Version:4.0.30319.42000
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
namespace Raytheon.LogDashboard.Resources {
|
||||
using System;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// A strongly-typed resource class, for looking up localized strings, etc.
|
||||
/// </summary>
|
||||
// This class was auto-generated by the StronglyTypedResourceBuilder
|
||||
// class via a tool like ResGen or Visual Studio.
|
||||
// To add or remove a member, edit your .ResX file then rerun ResGen
|
||||
// with the /str option, or rebuild your VS project.
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
internal class Resource1 {
|
||||
|
||||
private static global::System.Resources.ResourceManager resourceMan;
|
||||
|
||||
private static global::System.Globalization.CultureInfo resourceCulture;
|
||||
|
||||
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
|
||||
internal Resource1() {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns the cached ResourceManager instance used by this class.
|
||||
/// </summary>
|
||||
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||
internal static global::System.Resources.ResourceManager ResourceManager {
|
||||
get {
|
||||
if (object.ReferenceEquals(resourceMan, null)) {
|
||||
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Raytheon.LogDashboard.Resources.Resource1", typeof(Resource1).Assembly);
|
||||
resourceMan = temp;
|
||||
}
|
||||
return resourceMan;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Overrides the current thread's CurrentUICulture property for all
|
||||
/// resource lookups using this strongly typed resource class.
|
||||
/// </summary>
|
||||
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||
internal static global::System.Globalization.CultureInfo Culture {
|
||||
get {
|
||||
return resourceCulture;
|
||||
}
|
||||
set {
|
||||
resourceCulture = value;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Icon similar to (Icon).
|
||||
/// </summary>
|
||||
internal static System.Drawing.Icon LogDashboard {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("LogDashboard", resourceCulture);
|
||||
return ((System.Drawing.Icon)(obj));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,124 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
||||
<data name="LogDashboard" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>LogDashboard.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
</root>
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 40 KiB |
@@ -0,0 +1,105 @@
|
||||
<!--
|
||||
MainWindow.xaml
|
||||
12/4/2023
|
||||
|
||||
RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
COMPANY.
|
||||
|
||||
THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
|
||||
UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
|
||||
WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
PENALTIES.
|
||||
|
||||
DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
RECONSTRUCTION OF THE DOCUMENT.
|
||||
POC: Alex Kravchenko (1118268)
|
||||
-->
|
||||
<mah:MetroWindow x:Class="Raytheon.LogDashboard.View.MainWindow"
|
||||
xmlns:mah="clr-namespace:MahApps.Metro.Controls;assembly=MahApps.Metro"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:ctrl="clr-namespace:Raytheon.LogDashboard.View;assembly=Raytheon.LogDashboardLib"
|
||||
xmlns:Dialog="clr-namespace:MahApps.Metro.Controls.Dialogs;assembly=MahApps.Metro"
|
||||
DataContext="{Binding Main, Source={StaticResource Locator}}"
|
||||
Dialog:DialogParticipation.Register="{Binding}"
|
||||
WindowTitleBrush="{Binding IconColor}"
|
||||
mc:Ignorable="d"
|
||||
Title="Common Platforms Log Dashboard"
|
||||
ResizeMode="CanResizeWithGrip"
|
||||
Closing="MetroWindow_Closing"
|
||||
Height="{Binding CurrentWindowHeight, Mode=TwoWay}"
|
||||
Width="{Binding CurrentWindowWidth, Mode=TwoWay}"
|
||||
Left="{Binding CurrentWindowLeft, Mode=TwoWay}"
|
||||
Top="{Binding CurrentWindowTop, Mode=TwoWay}"
|
||||
Icon="/Resources/rt_logo_30h.png"
|
||||
Loaded="MainWindow_OnLoaded">
|
||||
|
||||
<mah:MetroWindow.Flyouts>
|
||||
<mah:FlyoutsControl>
|
||||
<mah:FlyoutsControl.ItemContainerStyle>
|
||||
<Style TargetType="{x:Type mah:Flyout}">
|
||||
<Setter Property="RenderTransform" Value="{x:Null}"></Setter>
|
||||
<Setter Property="AreAnimationsEnabled" Value="True" />
|
||||
<Setter Property="AnimateOpacity" Value="True" />
|
||||
<Setter Property="Theme" Value="Adapt" />
|
||||
<Setter Property="Position" Value="Right" />
|
||||
</Style>
|
||||
</mah:FlyoutsControl.ItemContainerStyle>
|
||||
|
||||
<mah:Flyout Header="Settings"
|
||||
MinWidth="600"
|
||||
Theme="Adapt"
|
||||
IsOpen="{Binding LogDashboard.ShowSettings, Source={StaticResource LogDashLocator}}">
|
||||
|
||||
<mah:MetroContentControl Margin="0,0,20,0">
|
||||
<ctrl:SettingsCtrl DataContext="{Binding Settings, Source={StaticResource LogDashLocator}}" />
|
||||
</mah:MetroContentControl>
|
||||
|
||||
</mah:Flyout>
|
||||
|
||||
<mah:Flyout Header="Search Namespaces"
|
||||
Theme="Adapt"
|
||||
MinWidth="400"
|
||||
IsOpen="{Binding LogDashboard.ShowTree, Source={StaticResource Locator}}">
|
||||
|
||||
<mah:MetroContentControl Margin="0,0,60,0">
|
||||
<ctrl:SidebarTreeView DataContext="{Binding LogDashboard, Source={StaticResource LogDashLocator}}" />
|
||||
</mah:MetroContentControl>
|
||||
|
||||
</mah:Flyout>
|
||||
|
||||
</mah:FlyoutsControl>
|
||||
|
||||
</mah:MetroWindow.Flyouts>
|
||||
|
||||
<Grid>
|
||||
<mah:MetroContentControl>
|
||||
<ctrl:LogDashboardCtrl DataContext="{Binding LogDashboard, Source={StaticResource Locator}}" />
|
||||
</mah:MetroContentControl>
|
||||
</Grid>
|
||||
|
||||
</mah:MetroWindow>
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,212 @@
|
||||
//******************************************************************************//
|
||||
// MainWindow.xaml.cs
|
||||
// 12/4/2023
|
||||
//
|
||||
// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
// PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
// AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
// UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
// RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
// CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
// OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
// COMPANY.
|
||||
//
|
||||
// THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
//
|
||||
// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
//
|
||||
// WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
// EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
// BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
// 120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
// 730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
// OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
// LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
// BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
// APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
// PENALTIES.
|
||||
//
|
||||
// DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
// FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
// INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
// DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
// RECONSTRUCTION OF THE DOCUMENT.
|
||||
// POC: Alex Kravchenko (1118268)
|
||||
//******************************************************************************//
|
||||
using System;
|
||||
using System.ComponentModel;
|
||||
using System.Linq;
|
||||
using System.Windows;
|
||||
using System.Windows.Interop;
|
||||
using System.Windows.Forms;
|
||||
using NLog;
|
||||
using Raytheon.LogDashboard.Helpers;
|
||||
using Raytheon.LogDashboard.ViewModel;
|
||||
using Application = System.Windows.Application;
|
||||
using Raytheon.LogDashboard.Resources;
|
||||
using MahApps.Metro.Controls;
|
||||
using MahApps.Metro.Controls.Dialogs;
|
||||
using GalaSoft.MvvmLight.Messaging;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Raytheon.LogDashboard.View
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for MainWindow.xaml
|
||||
/// </summary>
|
||||
public partial class MainWindow : MetroWindow, IDisposable
|
||||
{
|
||||
private static readonly Logger logger = LogManager.GetCurrentClassLogger();
|
||||
private NotifyIcon trayIcon;
|
||||
|
||||
public MainWindow()
|
||||
{
|
||||
InitializeComponent();
|
||||
|
||||
Loaded += (s, e) =>
|
||||
{
|
||||
WindowHandle = new WindowInteropHelper(Application.Current.MainWindow).Handle;
|
||||
HwndSource.FromHwnd(WindowHandle)?.AddHook(HandleMessages);
|
||||
};
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// On Loaded Event
|
||||
/// </summary>
|
||||
/// <param name="sender"></param>
|
||||
/// <param name="e"></param>
|
||||
private void MainWindow_OnLoaded(object sender, RoutedEventArgs e)
|
||||
{
|
||||
if (AppDomain.CurrentDomain.SetupInformation.ActivationArguments?.ActivationData != null)
|
||||
{
|
||||
string[] activationData = AppDomain.CurrentDomain.SetupInformation.ActivationArguments.ActivationData;
|
||||
foreach (var arg in activationData.Where(x => x.EndsWith(".txt") || x.EndsWith(".log") || x.EndsWith(".csv")))
|
||||
{
|
||||
ViewModelLocator.LogDashboard.ImportLogs(arg);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
List<string> args = Environment.GetCommandLineArgs().Where(x => x.EndsWith(".txt") || x.EndsWith(".log") || x.EndsWith(".csv")).ToList();
|
||||
if (args.Any())
|
||||
{
|
||||
ViewModelLocator.LogDashboard.ImportLogs(args.Where(x => x.EndsWith(".txt") || x.EndsWith(".log") || x.EndsWith(".csv")));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
#region tray
|
||||
|
||||
protected override void OnStateChanged(EventArgs e)
|
||||
{
|
||||
if (WindowState == WindowState.Minimized && Model.Settings.Instance.MinimizeToTray)
|
||||
{
|
||||
if (trayIcon == null)
|
||||
{
|
||||
trayIcon = new NotifyIcon
|
||||
{
|
||||
Icon = Resource1.LogDashboard,
|
||||
Visible = true,
|
||||
Text = "Log Viewer"
|
||||
};
|
||||
trayIcon.DoubleClick += delegate
|
||||
{
|
||||
Show();
|
||||
WindowState = WindowState.Normal;
|
||||
};
|
||||
|
||||
trayIcon.ContextMenuStrip = new ContextMenuStrip();
|
||||
ToolStripMenuItem openAppMenuItem = new ToolStripMenuItem("Open");
|
||||
ToolStripMenuItem exitAppMenuItem = new ToolStripMenuItem("Exit");
|
||||
|
||||
trayIcon.ContextMenuStrip.Items.AddRange(new ToolStripItem[] { openAppMenuItem, exitAppMenuItem });
|
||||
trayIcon.ContextMenuStrip.ItemClicked += TrayIconContextMenuClick;
|
||||
}
|
||||
Hide();
|
||||
}
|
||||
|
||||
base.OnStateChanged(e);
|
||||
}
|
||||
|
||||
private void TrayIconContextMenuClick(object sender, ToolStripItemClickedEventArgs e)
|
||||
{
|
||||
switch (e.ClickedItem.Text)
|
||||
{
|
||||
case "Open":
|
||||
Show();
|
||||
WindowState = WindowState.Normal;
|
||||
break;
|
||||
case "Exit":
|
||||
Close();
|
||||
Environment.Exit(0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
protected override void OnClosed(EventArgs e)
|
||||
{
|
||||
if (trayIcon != null)
|
||||
{
|
||||
trayIcon.Visible = false;
|
||||
trayIcon.Dispose();
|
||||
trayIcon.Icon = null;
|
||||
}
|
||||
|
||||
base.OnClosed(e);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
#region param transfer
|
||||
|
||||
public static IntPtr WindowHandle { get; private set; }
|
||||
|
||||
internal static void HandleParameter(string[] args)
|
||||
{
|
||||
if (Application.Current?.MainWindow is MainWindow mainWindow &&
|
||||
args != null && args.Length > 0 && args.All(x => x.EndsWith(".txt") || x.EndsWith(".log") || x.EndsWith(".csv")))
|
||||
{
|
||||
ViewModelLocator.LogDashboard.ImportLogs(args.First());
|
||||
}
|
||||
}
|
||||
|
||||
private static IntPtr HandleMessages(IntPtr handle, int message, IntPtr wParameter, IntPtr lParameter, ref Boolean handled)
|
||||
{
|
||||
string data = UnsafeNative.GetMessage(message, lParameter);
|
||||
|
||||
if (data != null)
|
||||
{
|
||||
if(Application.Current.MainWindow == null)
|
||||
{
|
||||
return IntPtr.Zero;
|
||||
}
|
||||
|
||||
if(Application.Current.MainWindow.WindowState == WindowState.Minimized)
|
||||
{
|
||||
Application.Current.MainWindow.WindowState = WindowState.Normal;
|
||||
}
|
||||
|
||||
UnsafeNative.SetForegroundWindow(new WindowInteropHelper(Application.Current.MainWindow).Handle);
|
||||
|
||||
string[] args = data.Split(' ');
|
||||
HandleParameter(args);
|
||||
handled = true;
|
||||
}
|
||||
|
||||
return IntPtr.Zero;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
trayIcon?.Dispose();
|
||||
}
|
||||
|
||||
private void MetroWindow_Closing(object sender, CancelEventArgs e)
|
||||
{
|
||||
ViewModelLocator.LogDashboard.Dispose();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,167 @@
|
||||
//******************************************************************************//
|
||||
// MainWindowViewModel.cs
|
||||
// 12/4/2023
|
||||
//
|
||||
// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
// PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
// AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
// UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
// RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
// CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
// OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
// COMPANY.
|
||||
//
|
||||
// THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
//
|
||||
// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
//
|
||||
// WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
// EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
// BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
// 120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
// 730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
// OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
// LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
// BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
// APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
// PENALTIES.
|
||||
//
|
||||
// DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
// FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
// INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
// DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
// RECONSTRUCTION OF THE DOCUMENT.
|
||||
// POC: Alex Kravchenko (1118268)
|
||||
//******************************************************************************//
|
||||
using ControlzEx.Theming;
|
||||
using GalaSoft.MvvmLight;
|
||||
using GalaSoft.MvvmLight.Messaging;
|
||||
using MahApps.Metro.Controls.Dialogs;
|
||||
using System.Windows;
|
||||
using System.Windows.Media;
|
||||
|
||||
namespace Raytheon.LogDashboard.ViewModel
|
||||
{
|
||||
public class MainWindowViewModel : ViewModelBase
|
||||
{
|
||||
protected static LogDashViewModelLocator LocatorInstance;
|
||||
private IDialogCoordinator _dialogCoordinator;
|
||||
|
||||
public MainWindowViewModel(IDialogCoordinator instance)
|
||||
{
|
||||
_dialogCoordinator = instance;
|
||||
|
||||
Messenger.Default.Register<string>(this, "ColorChange", ColorChangeHandler);
|
||||
Messenger.Default.Register<string>(this, "ThemeChange", ThemeChangeHandler);
|
||||
|
||||
Messenger.Default.Register<string>(this, "DisplayCustomMessage", DisplayCustomMessageHandler);
|
||||
|
||||
LocatorInstance = (Application.Current.Resources["LogDashLocator"] as LogDashViewModelLocator);
|
||||
}
|
||||
|
||||
private void ThemeChangeHandler(string theme)
|
||||
{
|
||||
if(!string.IsNullOrEmpty(theme))
|
||||
{
|
||||
if(theme.Contains("Dark"))
|
||||
{
|
||||
ThemeManager.Current.ChangeThemeBaseColor(Application.Current.MainWindow, "Dark");
|
||||
}
|
||||
else
|
||||
{
|
||||
ThemeManager.Current.ChangeThemeBaseColor(Application.Current.MainWindow, "Light");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void ColorChangeHandler(string selectedColor)
|
||||
{
|
||||
if(!string.IsNullOrEmpty(selectedColor) && Application.Current.MainWindow != null)
|
||||
{
|
||||
ThemeManager.Current.ChangeThemeColorScheme(Application.Current.MainWindow, selectedColor);
|
||||
|
||||
Application.Current.Resources["MahApps.Brushes.ToggleSwitch.FillOn"] = ColorConverter.ConvertFromString(selectedColor);
|
||||
|
||||
RaisePropertyChanged(() => IconColor);
|
||||
}
|
||||
}
|
||||
|
||||
public SolidColorBrush IconColor
|
||||
{
|
||||
get => LocatorInstance.SelectedColorTheme.Color;
|
||||
}
|
||||
|
||||
public static double PreviousWindowHeight
|
||||
{
|
||||
get { return Properties.Settings.Default.PreviousWindowHeight; }
|
||||
set { Properties.Settings.Default.PreviousWindowHeight = value; }
|
||||
}
|
||||
public static double CurrentWindowHeight
|
||||
{
|
||||
get { return Properties.Settings.Default.CurrentWindowHeight; }
|
||||
set
|
||||
{
|
||||
Properties.Settings.Default.PreviousWindowHeight = Properties.Settings.Default.CurrentWindowHeight;
|
||||
Properties.Settings.Default.CurrentWindowHeight = value;
|
||||
Properties.Settings.Default.Save();
|
||||
}
|
||||
}
|
||||
|
||||
public static double PreviousWindowWidth
|
||||
{
|
||||
get { return Properties.Settings.Default.PreviousWindowWidth; }
|
||||
set { Properties.Settings.Default.PreviousWindowWidth = value; }
|
||||
}
|
||||
public static double CurrentWindowWidth
|
||||
{
|
||||
get { return Properties.Settings.Default.CurrentWindowWidth; }
|
||||
set
|
||||
{
|
||||
Properties.Settings.Default.PreviousWindowWidth = Properties.Settings.Default.CurrentWindowWidth;
|
||||
Properties.Settings.Default.CurrentWindowWidth = value;
|
||||
Properties.Settings.Default.Save();
|
||||
}
|
||||
}
|
||||
|
||||
public static double PreviousWindowLeft
|
||||
{
|
||||
get { return Properties.Settings.Default.PreviousWindowLeft; }
|
||||
set { Properties.Settings.Default.PreviousWindowLeft = value; }
|
||||
}
|
||||
public static double CurrentWindowLeft
|
||||
{
|
||||
get { return Properties.Settings.Default.CurrentWindowLeft; }
|
||||
set
|
||||
{
|
||||
Properties.Settings.Default.PreviousWindowLeft = Properties.Settings.Default.CurrentWindowLeft;
|
||||
Properties.Settings.Default.CurrentWindowLeft = value;
|
||||
Properties.Settings.Default.Save();
|
||||
}
|
||||
}
|
||||
|
||||
public static double PreviousWindowTop
|
||||
{
|
||||
get { return Properties.Settings.Default.PreviousWindowTop; }
|
||||
set { Properties.Settings.Default.PreviousWindowTop = value; }
|
||||
}
|
||||
public static double CurrentWindowTop
|
||||
{
|
||||
get { return Properties.Settings.Default.CurrentWindowTop; }
|
||||
set
|
||||
{
|
||||
Properties.Settings.Default.PreviousWindowTop = Properties.Settings.Default.CurrentWindowTop;
|
||||
Properties.Settings.Default.CurrentWindowTop = value;
|
||||
Properties.Settings.Default.Save();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// handles custom message with single Okay button
|
||||
/// </summary>
|
||||
/// <param name="message"></param>
|
||||
private async void DisplayCustomMessageHandler(string message)
|
||||
{
|
||||
await _dialogCoordinator.ShowMessageAsync(this, "Log Dashboard", message).ConfigureAwait(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
//******************************************************************************//
|
||||
// ViewModelLocator.cs
|
||||
// 12/4/2023
|
||||
//
|
||||
// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
// PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
// AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
// UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
// RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
// CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
// OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
// COMPANY.
|
||||
//
|
||||
// THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
//
|
||||
// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
//
|
||||
// WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
// EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
// BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
// 120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
// 730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
// OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
// LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
// BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
// APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
// PENALTIES.
|
||||
//
|
||||
// DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
// FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
// INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
// DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
// RECONSTRUCTION OF THE DOCUMENT.
|
||||
// POC: Alex Kravchenko (1118268)
|
||||
//******************************************************************************//
|
||||
|
||||
// Ignore Spelling: Locator
|
||||
|
||||
using CommonServiceLocator;
|
||||
using GalaSoft.MvvmLight;
|
||||
using GalaSoft.MvvmLight.Ioc;
|
||||
using MahApps.Metro.Controls.Dialogs;
|
||||
|
||||
namespace Raytheon.LogDashboard.ViewModel
|
||||
{
|
||||
public class ViewModelLocator : ViewModelBase
|
||||
{
|
||||
public ViewModelLocator()
|
||||
{
|
||||
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
|
||||
|
||||
SimpleIoc.Default.Register(() => new MainWindowViewModel(DialogCoordinator.Instance));
|
||||
SimpleIoc.Default.Register<LogDashboardViewModel>();
|
||||
}
|
||||
public static MainWindowViewModel Main => ServiceLocator.Current.GetInstance<MainWindowViewModel>();
|
||||
public static LogDashboardViewModel LogDashboard => ServiceLocator.Current.GetInstance<LogDashboardViewModel>();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 17
|
||||
VisualStudioVersion = 17.6.33801.468
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{99AAB3BD-FA07-44B0-AEFE-8C3424A773CC}"
|
||||
ProjectSection(SolutionItems) = preProject
|
||||
LogDashboard.sln.licenseheader = LogDashboard.sln.licenseheader
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LogDashboard.UI", "LogDashboard.UI\LogDashboard.UI.csproj", "{AF3B84E0-E237-44F3-9043-26D571F8B31D}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LogDashboard", "LogDashboard\LogDashboard.csproj", "{66F98C3C-539E-4A4F-AF39-DF2A62AD1C5C}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Release|Any CPU = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{AF3B84E0-E237-44F3-9043-26D571F8B31D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{AF3B84E0-E237-44F3-9043-26D571F8B31D}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{AF3B84E0-E237-44F3-9043-26D571F8B31D}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{AF3B84E0-E237-44F3-9043-26D571F8B31D}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{66F98C3C-539E-4A4F-AF39-DF2A62AD1C5C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{66F98C3C-539E-4A4F-AF39-DF2A62AD1C5C}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{66F98C3C-539E-4A4F-AF39-DF2A62AD1C5C}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{66F98C3C-539E-4A4F-AF39-DF2A62AD1C5C}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {2F4122A7-E92D-4788-BD7F-12983BC7718A}
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
@@ -0,0 +1,79 @@
|
||||
extensions: designer.cs generated.cs
|
||||
extensions: .cs .cpp .h
|
||||
//******************************************************************************//
|
||||
// %FileName%
|
||||
// %CurrentMonth%/%CurrentDay%/%CurrentYear%
|
||||
//
|
||||
// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
// PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
// AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
// UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
// RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
// CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
// OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
// COMPANY.
|
||||
//
|
||||
// THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
//
|
||||
// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
//
|
||||
// WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
// EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
// BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
// 120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
// 730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
// OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
// LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
// BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
// APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
// PENALTIES.
|
||||
//
|
||||
// DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
// FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
// INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
// DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
// RECONSTRUCTION OF THE DOCUMENT.
|
||||
// POC: %UserDisplayName% (%UserName%)
|
||||
//******************************************************************************//
|
||||
extensions: .aspx .ascx
|
||||
<%--
|
||||
COPYRIGHT RAYTHEON COMPANY
|
||||
--%>
|
||||
extensions: .vb
|
||||
'Sample license text.
|
||||
extensions: .xaml .xml .config .xsd
|
||||
<!--
|
||||
%FileName%
|
||||
%CurrentMonth%/%CurrentDay%/%CurrentYear%
|
||||
|
||||
RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
COMPANY.
|
||||
|
||||
THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
|
||||
UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
|
||||
WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
PENALTIES.
|
||||
|
||||
DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
RECONSTRUCTION OF THE DOCUMENT.
|
||||
POC: %UserDisplayName% (%UserName%)
|
||||
-->
|
||||
@@ -0,0 +1,59 @@
|
||||
//******************************************************************************//
|
||||
// CountToVisibilityConverter.cs
|
||||
// 12/4/2023
|
||||
//
|
||||
// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
// PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
// AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
// UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
// RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
// CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
// OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
// COMPANY.
|
||||
//
|
||||
// THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
//
|
||||
// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
//
|
||||
// WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
// EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
// BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
// 120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
// 730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
// OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
// LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
// BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
// APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
// PENALTIES.
|
||||
//
|
||||
// DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
// FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
// INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
// DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
// RECONSTRUCTION OF THE DOCUMENT.
|
||||
// POC: Alex Kravchenko (1118268)
|
||||
//******************************************************************************//
|
||||
using System;
|
||||
using System.Globalization;
|
||||
using System.Windows.Data;
|
||||
using System.Windows;
|
||||
|
||||
namespace Raytheon.LogDashboard.Converters
|
||||
{
|
||||
public class CountToVisibilityConverter : IValueConverter
|
||||
{
|
||||
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
|
||||
{
|
||||
if (value is int count)
|
||||
{
|
||||
return count > 0 ? Visibility.Visible : Visibility.Collapsed;
|
||||
}
|
||||
return Visibility.Visible;
|
||||
}
|
||||
|
||||
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,63 @@
|
||||
//******************************************************************************//
|
||||
// DataConverter.cs
|
||||
// 12/4/2023
|
||||
//
|
||||
// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
// PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
// AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
// UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
// RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
// CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
// OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
// COMPANY.
|
||||
//
|
||||
// THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
//
|
||||
// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
//
|
||||
// WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
// EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
// BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
// 120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
// 730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
// OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
// LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
// BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
// APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
// PENALTIES.
|
||||
//
|
||||
// DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
// FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
// INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
// DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
// RECONSTRUCTION OF THE DOCUMENT.
|
||||
// POC: Alex Kravchenko (1118268)
|
||||
//******************************************************************************//
|
||||
using System;
|
||||
using System.Globalization;
|
||||
using System.Windows.Data;
|
||||
|
||||
namespace Raytheon.LogDashboard.Converters
|
||||
{
|
||||
public class DataConverter : IValueConverter
|
||||
{
|
||||
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
|
||||
{
|
||||
if(value != null && value is DateTime dateValue)
|
||||
{
|
||||
string dataFormat = Model.Settings.Instance.DataFormat;
|
||||
if(string.IsNullOrEmpty(dataFormat))
|
||||
{
|
||||
return dateValue;
|
||||
}
|
||||
return dateValue.ToString(Model.Settings.Instance.DataFormat);
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,62 @@
|
||||
//******************************************************************************//
|
||||
// LoggerDisplayConverter.cs
|
||||
// 12/4/2023
|
||||
//
|
||||
// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
// PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
// AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
// UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
// RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
// CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
// OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
// COMPANY.
|
||||
//
|
||||
// THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
//
|
||||
// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
//
|
||||
// WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
// EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
// BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
// 120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
// 730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
// OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
// LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
// BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
// APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
// PENALTIES.
|
||||
//
|
||||
// DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
// FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
// INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
// DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
// RECONSTRUCTION OF THE DOCUMENT.
|
||||
// POC: Alex Kravchenko (1118268)
|
||||
//******************************************************************************//
|
||||
using System;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
using System.Windows.Data;
|
||||
|
||||
namespace Raytheon.LogDashboard.Converters
|
||||
{
|
||||
public class LoggerDisplayConverter : IValueConverter
|
||||
{
|
||||
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
|
||||
{
|
||||
if(value != null && value is string strValue && !string.IsNullOrEmpty(strValue))
|
||||
{
|
||||
if(strValue.Split('.').Length > 0)
|
||||
{
|
||||
return strValue.Split('.').Last();
|
||||
}
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,74 @@
|
||||
//******************************************************************************//
|
||||
// MaxLengthConverter.cs
|
||||
// 12/4/2023
|
||||
//
|
||||
// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
// PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
// AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
// UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
// RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
// CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
// OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
// COMPANY.
|
||||
//
|
||||
// THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
//
|
||||
// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
//
|
||||
// WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
// EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
// BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
// 120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
// 730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
// OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
// LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
// BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
// APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
// PENALTIES.
|
||||
//
|
||||
// DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
// FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
// INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
// DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
// RECONSTRUCTION OF THE DOCUMENT.
|
||||
// POC: Alex Kravchenko (1118268)
|
||||
//******************************************************************************//
|
||||
using System;
|
||||
using System.Globalization;
|
||||
using System.Windows.Data;
|
||||
|
||||
namespace Raytheon.LogDashboard.Converters
|
||||
{
|
||||
public class MaxLengthConverter : IValueConverter
|
||||
{
|
||||
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
|
||||
{
|
||||
if(value is string str && !string.IsNullOrEmpty(str) && int.TryParse((string)parameter, out int maxLength))
|
||||
{
|
||||
int indexNewLine = str.IndexOf(Environment.NewLine, StringComparison.Ordinal);
|
||||
if(indexNewLine != -1 && indexNewLine < maxLength)
|
||||
{
|
||||
return str.Substring(0, indexNewLine) + "...";
|
||||
}
|
||||
|
||||
int indexN = str.IndexOf('\n');
|
||||
if(indexN != -1 && indexN < maxLength)
|
||||
{
|
||||
return str.Substring(0, indexN) + "...";
|
||||
}
|
||||
|
||||
if(str.Length > maxLength)
|
||||
{
|
||||
return str.Substring(0, maxLength) + "...";
|
||||
}
|
||||
return str;
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,59 @@
|
||||
//******************************************************************************//
|
||||
// ProgressStateConverter.cs
|
||||
// 12/4/2023
|
||||
//
|
||||
// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
// PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
// AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
// UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
// RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
// CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
// OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
// COMPANY.
|
||||
//
|
||||
// THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
//
|
||||
// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
//
|
||||
// WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
// EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
// BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
// 120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
// 730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
// OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
// LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
// BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
// APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
// PENALTIES.
|
||||
//
|
||||
// DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
// FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
// INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
// DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
// RECONSTRUCTION OF THE DOCUMENT.
|
||||
// POC: Alex Kravchenko (1118268)
|
||||
//******************************************************************************//
|
||||
using System;
|
||||
using System.Globalization;
|
||||
using System.Windows.Data;
|
||||
using System.Windows.Shell;
|
||||
|
||||
namespace Raytheon.LogDashboard.Converters
|
||||
{
|
||||
class ProgressStateConverter : IValueConverter
|
||||
{
|
||||
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
|
||||
{
|
||||
if (value is bool val)
|
||||
{
|
||||
return val ? TaskbarItemProgressState.Indeterminate : TaskbarItemProgressState.Normal;
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,56 @@
|
||||
//******************************************************************************//
|
||||
// TreeViewLineConverter.cs
|
||||
// 12/4/2023
|
||||
//
|
||||
// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
// PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
// AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
// UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
// RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
// CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
// OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
// COMPANY.
|
||||
//
|
||||
// THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
//
|
||||
// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
//
|
||||
// WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
// EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
// BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
// 120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
// 730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
// OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
// LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
// BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
// APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
// PENALTIES.
|
||||
//
|
||||
// DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
// FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
// INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
// DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
// RECONSTRUCTION OF THE DOCUMENT.
|
||||
// POC: Alex Kravchenko (1118268)
|
||||
//******************************************************************************//
|
||||
using System;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Data;
|
||||
|
||||
namespace Raytheon.LogDashboard.Converters
|
||||
{
|
||||
public class TreeViewLineConverter : IValueConverter
|
||||
{
|
||||
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
|
||||
{
|
||||
TreeViewItem item = (TreeViewItem)value;
|
||||
ItemsControl ic = ItemsControl.ItemsControlFromItemContainer(item);
|
||||
return ic.ItemContainerGenerator.IndexFromContainer(item) == ic.Items.Count - 1;
|
||||
}
|
||||
|
||||
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
|
||||
{
|
||||
throw new Exception("The method or operation is not implemented.");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,97 @@
|
||||
//******************************************************************************//
|
||||
// AsyncObservableCollection.cs
|
||||
// 12/4/2023
|
||||
//
|
||||
// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
// PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
// AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
// UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
// RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
// CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
// OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
// COMPANY.
|
||||
//
|
||||
// THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
//
|
||||
// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
//
|
||||
// WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
// EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
// BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
// 120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
// 730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
// OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
// LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
// BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
// APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
// PENALTIES.
|
||||
//
|
||||
// DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
// FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
// INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
// DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
// RECONSTRUCTION OF THE DOCUMENT.
|
||||
// POC: Alex Kravchenko (1118268)
|
||||
//******************************************************************************//
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.Collections.Specialized;
|
||||
using System.ComponentModel;
|
||||
using System.Threading;
|
||||
|
||||
namespace Raytheon.LogDashboard.Helpers
|
||||
{
|
||||
public class AsyncObservableCollection<T> : ObservableCollection<T>
|
||||
{
|
||||
private readonly SynchronizationContext synchronizationContext = SynchronizationContext.Current;
|
||||
|
||||
public AsyncObservableCollection()
|
||||
{
|
||||
}
|
||||
|
||||
public AsyncObservableCollection(IEnumerable<T> list)
|
||||
: base(list)
|
||||
{
|
||||
}
|
||||
|
||||
protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
|
||||
{
|
||||
if(SynchronizationContext.Current == synchronizationContext)
|
||||
{
|
||||
// Execute the CollectionChanged event on the current thread
|
||||
RaiseCollectionChanged(e);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Raises the CollectionChanged event on the creator thread
|
||||
synchronizationContext.Send(RaiseCollectionChanged, e);
|
||||
}
|
||||
}
|
||||
|
||||
private void RaiseCollectionChanged(object param)
|
||||
{
|
||||
// We are in the creator thread, call the base implementation directly
|
||||
base.OnCollectionChanged((NotifyCollectionChangedEventArgs)param);
|
||||
}
|
||||
|
||||
protected override void OnPropertyChanged(PropertyChangedEventArgs e)
|
||||
{
|
||||
if(SynchronizationContext.Current == synchronizationContext)
|
||||
{
|
||||
// Execute the PropertyChanged event on the current thread
|
||||
RaisePropertyChanged(e);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Raises the PropertyChanged event on the creator thread
|
||||
synchronizationContext.Send(RaisePropertyChanged, e);
|
||||
}
|
||||
}
|
||||
|
||||
private void RaisePropertyChanged(object param)
|
||||
{
|
||||
// We are in the creator thread, call the base implementation directly
|
||||
base.OnPropertyChanged((PropertyChangedEventArgs)param);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,92 @@
|
||||
//******************************************************************************//
|
||||
// BindableSelectedItemBehavior.cs
|
||||
// 12/4/2023
|
||||
//
|
||||
// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
// PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
// AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
// UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
// RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
// CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
// OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
// COMPANY.
|
||||
//
|
||||
// THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
//
|
||||
// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
//
|
||||
// WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
// EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
// BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
// 120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
// 730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
// OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
// LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
// BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
// APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
// PENALTIES.
|
||||
//
|
||||
// DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
// FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
// INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
// DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
// RECONSTRUCTION OF THE DOCUMENT.
|
||||
// POC: Alex Kravchenko (1118268)
|
||||
//******************************************************************************//
|
||||
using System.Windows.Controls;
|
||||
using System.Windows;
|
||||
using System.Windows.Interactivity;
|
||||
|
||||
namespace Raytheon.LogDashboard.Helpers
|
||||
{
|
||||
/// <summary>
|
||||
/// Behavior that makes the
|
||||
/// <see>
|
||||
/// <cref>System.Windows.Controls.TreeView.SelectedItem</cref>
|
||||
/// </see>
|
||||
/// bindable.
|
||||
/// </summary>
|
||||
public class BindableSelectedItemBehavior : Behavior<TreeView>
|
||||
{
|
||||
#region SelectedItem Property
|
||||
|
||||
public object SelectedItem
|
||||
{
|
||||
get => GetValue(SelectedItemProperty);
|
||||
set => SetValue(SelectedItemProperty, value);
|
||||
}
|
||||
|
||||
public static readonly DependencyProperty SelectedItemProperty =
|
||||
DependencyProperty.Register("SelectedItem", typeof(object), typeof(BindableSelectedItemBehavior), new UIPropertyMetadata(null, OnSelectedItemChanged));
|
||||
|
||||
private static void OnSelectedItemChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
|
||||
{
|
||||
TreeViewItem item = e.NewValue as TreeViewItem;
|
||||
item?.SetValue(TreeViewItem.IsSelectedProperty, true);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
protected override void OnAttached()
|
||||
{
|
||||
base.OnAttached();
|
||||
|
||||
AssociatedObject.SelectedItemChanged += OnTreeViewSelectedItemChanged;
|
||||
}
|
||||
|
||||
protected override void OnDetaching()
|
||||
{
|
||||
base.OnDetaching();
|
||||
|
||||
if(AssociatedObject != null)
|
||||
{
|
||||
AssociatedObject.SelectedItemChanged -= OnTreeViewSelectedItemChanged;
|
||||
}
|
||||
}
|
||||
|
||||
private void OnTreeViewSelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
|
||||
{
|
||||
SelectedItem = e.NewValue;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,102 @@
|
||||
//******************************************************************************//
|
||||
// EnumerationExtension.cs
|
||||
// 12/4/2023
|
||||
//
|
||||
// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
// PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
// AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
// UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
// RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
// CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
// OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
// COMPANY.
|
||||
//
|
||||
// THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
//
|
||||
// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
//
|
||||
// WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
// EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
// BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
// 120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
// 730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
// OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
// LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
// BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
// APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
// PENALTIES.
|
||||
//
|
||||
// DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
// FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
// INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
// DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
// RECONSTRUCTION OF THE DOCUMENT.
|
||||
// POC: Alex Kravchenko (1118268)
|
||||
//******************************************************************************//
|
||||
using System;
|
||||
using System.ComponentModel;
|
||||
using System.Linq;
|
||||
using System.Windows.Markup;
|
||||
|
||||
namespace Raytheon.LogDashboard.Helpers
|
||||
{
|
||||
public class EnumerationExtension : MarkupExtension
|
||||
{
|
||||
private Type _enumType;
|
||||
|
||||
|
||||
public EnumerationExtension(Type enumType)
|
||||
{
|
||||
EnumType = enumType ?? throw new ArgumentNullException(nameof(enumType));
|
||||
}
|
||||
|
||||
public Type EnumType
|
||||
{
|
||||
get { return _enumType; }
|
||||
private set
|
||||
{
|
||||
if(_enumType == value)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var enumType = Nullable.GetUnderlyingType(value) ?? value;
|
||||
if(enumType.IsEnum == false)
|
||||
{
|
||||
throw new ArgumentException("Type must be an Enum.");
|
||||
}
|
||||
|
||||
_enumType = value;
|
||||
}
|
||||
}
|
||||
|
||||
public override object ProvideValue(IServiceProvider serviceProvider)
|
||||
{
|
||||
var enumValues = Enum.GetValues(EnumType);
|
||||
|
||||
return (
|
||||
from object enumValue in enumValues
|
||||
select new EnumerationMember
|
||||
{
|
||||
Value = enumValue,
|
||||
Description = GetDescription(enumValue)
|
||||
}).ToArray();
|
||||
}
|
||||
|
||||
private string GetDescription(object enumValue)
|
||||
{
|
||||
return EnumType
|
||||
.GetField(enumValue.ToString())
|
||||
.GetCustomAttributes(typeof(DescriptionAttribute), false)
|
||||
.FirstOrDefault() is DescriptionAttribute descriptionAttribute
|
||||
? descriptionAttribute.Description
|
||||
: enumValue.ToString();
|
||||
}
|
||||
|
||||
public class EnumerationMember
|
||||
{
|
||||
public string Description { get; set; }
|
||||
public object Value { get; set; }
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,280 @@
|
||||
//******************************************************************************//
|
||||
// ExtensionMethods.cs
|
||||
// 12/4/2023
|
||||
//
|
||||
// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
// PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
// AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
// UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
// RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
// CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
// OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
// COMPANY.
|
||||
//
|
||||
// THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
//
|
||||
// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
//
|
||||
// WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
// EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
// BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
// 120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
// 730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
// OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
// LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
// BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
// APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
// PENALTIES.
|
||||
//
|
||||
// DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
// FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
// INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
// DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
// RECONSTRUCTION OF THE DOCUMENT.
|
||||
// POC: Alex Kravchenko (1118268)
|
||||
//******************************************************************************//
|
||||
using Raytheon.LogDashboard.Model;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Windows.Media;
|
||||
|
||||
namespace Raytheon.LogDashboard.Helpers
|
||||
{
|
||||
public static class ExtensionMethods
|
||||
{
|
||||
/// <summary>
|
||||
/// Checks whether a FileInfo or DirectoryInfo object is a directory, or intended to be a directory.
|
||||
/// </summary>
|
||||
/// <param name="fileSystemInfo"></param>
|
||||
/// <returns></returns>
|
||||
public static bool IsDirectory(this FileSystemInfo fileSystemInfo)
|
||||
{
|
||||
if(fileSystemInfo == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if((int)fileSystemInfo.Attributes != -1)
|
||||
{
|
||||
// if attributes are initialized check the directory flag
|
||||
return fileSystemInfo.Attributes.HasFlag(FileAttributes.Directory);
|
||||
}
|
||||
|
||||
// If we get here the file probably doesn't exist yet. The best we can do is
|
||||
// try to judge intent. Because directories can have extensions and files
|
||||
// can lack them, we can't rely on filename.
|
||||
//
|
||||
// We can reasonably assume that if the path doesn't exist yet and
|
||||
// FileSystemInfo is a DirectoryInfo, a directory is intended. FileInfo can
|
||||
// make a directory, but it would be a bizarre code path.
|
||||
|
||||
return fileSystemInfo is DirectoryInfo;
|
||||
}
|
||||
|
||||
public static string FirstCharToUpper(this string input)
|
||||
{
|
||||
switch(input)
|
||||
{
|
||||
case null:
|
||||
throw new ArgumentNullException(nameof(input));
|
||||
case "":
|
||||
throw new ArgumentException($"{nameof(input)} cannot be empty", nameof(input));
|
||||
default:
|
||||
return input.First().ToString().ToUpper() + input.Substring(1);
|
||||
}
|
||||
}
|
||||
|
||||
public static bool Contains(this string source, string toCheck, StringComparison comp)
|
||||
{
|
||||
return source?.IndexOf(toCheck, comp) >= 0;
|
||||
}
|
||||
|
||||
public static IEnumerable<T> TakeLast<T>(this IEnumerable<T> source, int N)
|
||||
{
|
||||
return source.Skip(Math.Max(0, source.Count() - N));
|
||||
}
|
||||
|
||||
public static IEnumerable<TSource> DistinctBy<TSource, TKey>
|
||||
(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
|
||||
{
|
||||
HashSet<TKey> seenKeys = new HashSet<TKey>();
|
||||
foreach(TSource element in source)
|
||||
{
|
||||
if(seenKeys.Add(keySelector(element)))
|
||||
{
|
||||
yield return element;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert the Brush to a ARGB - Color.
|
||||
/// </summary>
|
||||
/// <param name="brush">your object</param>
|
||||
/// <returns>
|
||||
/// White = #ffffffff
|
||||
/// Green = #ff00ff00
|
||||
/// </returns>
|
||||
public static string ToARGB(this SolidColorBrush brush)
|
||||
{
|
||||
if(brush == null)
|
||||
{
|
||||
throw new ArgumentNullException();
|
||||
}
|
||||
|
||||
var c = brush.Color;
|
||||
return $"#{c.A:X2}{c.R:X2}{c.G:X2}{c.B:X2}";
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// set the current brush to a new color based on the #argb string
|
||||
/// </summary>
|
||||
/// <param name="brush">your object</param>
|
||||
/// <param name="argb">The #ARGB Color</param>
|
||||
/// <returns>the same object as you run the function</returns>
|
||||
public static SolidColorBrush FromARGB(this SolidColorBrush brush, string argb)
|
||||
{
|
||||
if(argb.Length != 9)
|
||||
{
|
||||
throw new FormatException("we need #aarrggbb as color");
|
||||
}
|
||||
|
||||
byte a = Convert.ToByte(int.Parse(argb.Substring(1, 2), NumberStyles.HexNumber));
|
||||
byte r = Convert.ToByte(int.Parse(argb.Substring(3, 2), NumberStyles.HexNumber));
|
||||
byte g = Convert.ToByte(int.Parse(argb.Substring(5, 2), NumberStyles.HexNumber));
|
||||
byte b = Convert.ToByte(int.Parse(argb.Substring(7, 2), NumberStyles.HexNumber));
|
||||
Color c = Color.FromArgb(a, r, g, b);
|
||||
brush.Color = c;
|
||||
return brush;
|
||||
}
|
||||
|
||||
public static HashSet<T> ToHashSet<T>(this IEnumerable<T> source, IEqualityComparer<T> comparer = null)
|
||||
{
|
||||
return new HashSet<T>(source.ToList(), comparer);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// returns true if string contains any of the members in search array
|
||||
/// </summary>
|
||||
/// <param name="line"></param>
|
||||
/// <param name="search"></param>
|
||||
/// <param name="ignoreCase"></param>
|
||||
/// <returns></returns>
|
||||
public static bool ContainsAnyOf(this String line, string[] search, bool ignoreCase = false)
|
||||
{
|
||||
return search.Any(x => ignoreCase ? line.ToUpper().Contains(x.ToUpper()) : line.Contains(x));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// returns true if string contains any of the members in search list patterns
|
||||
/// </summary>
|
||||
/// <param name="input"></param>
|
||||
/// <param name="patterns"></param>
|
||||
/// <param name="ignoreCase"></param>
|
||||
/// <returns></returns>
|
||||
public static bool ContainsAnyOfPattern(this string input, string[] patterns, bool ignoreCase = false)
|
||||
{
|
||||
foreach(string pattern in patterns)
|
||||
{
|
||||
if(Regex.IsMatch(input, pattern, ignoreCase ? RegexOptions.IgnoreCase : RegexOptions.None))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// does the string begins with regex pattern?
|
||||
/// </summary>
|
||||
/// <param name="input"></param>
|
||||
/// <param name="pattern"></param>
|
||||
/// <returns></returns>
|
||||
public static bool StartsWithPattern(this string input, string pattern)
|
||||
{
|
||||
if(string.IsNullOrEmpty(input))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return Regex.IsMatch(input, $"^{pattern}");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// truncates DateTime
|
||||
/// </summary>
|
||||
/// <param name="dateTime"></param>
|
||||
/// <param name="timeSpan"></param>
|
||||
/// <returns></returns>
|
||||
public static DateTime Truncate(this DateTime dateTime, TimeSpan timeSpan)
|
||||
{
|
||||
if(timeSpan == TimeSpan.Zero)
|
||||
{
|
||||
return dateTime; // Or could throw an ArgumentException
|
||||
}
|
||||
|
||||
if(dateTime == DateTime.MinValue || dateTime == DateTime.MaxValue)
|
||||
{
|
||||
return dateTime; // do not modify "guard" values
|
||||
}
|
||||
|
||||
return dateTime.AddTicks(-(dateTime.Ticks % timeSpan.Ticks));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// filters log messages from the main list
|
||||
/// </summary>
|
||||
/// <param name="messages"></param>
|
||||
/// <param name="text"></param>
|
||||
/// <param name="matchCase"></param>
|
||||
/// <param name="matchWholeWord"></param>
|
||||
/// <param name="useRegularExp"></param>
|
||||
/// <param name="level"></param>
|
||||
/// <returns></returns>
|
||||
public static IEnumerable<LogMessage> Filter(this IEnumerable<LogMessage> messages,
|
||||
string text,
|
||||
bool matchCase,
|
||||
bool matchWholeWord,
|
||||
bool useRegularExp,
|
||||
DashboardLogLevel level = DashboardLogLevel.Trace)
|
||||
{
|
||||
IEnumerable<LogMessage> searchResult = messages.ToList();
|
||||
|
||||
if(!matchCase && !matchWholeWord)
|
||||
{
|
||||
return searchResult.Where(x => level.HasFlag(x.Level) &&
|
||||
(x.Message.ToUpper().Contains(text, StringComparison.OrdinalIgnoreCase) ||
|
||||
(useRegularExp && Regex.IsMatch(x.Message.ToUpper(), text, RegexOptions.IgnoreCase))));
|
||||
}
|
||||
|
||||
if(matchCase && !matchWholeWord)
|
||||
{
|
||||
return searchResult.Where(x => level.HasFlag(x.Level) && (x.Message.Contains(text) || (useRegularExp && Regex.IsMatch(x.Message, text))));
|
||||
}
|
||||
|
||||
if(matchCase && matchWholeWord)
|
||||
{
|
||||
return searchResult.Where(x => level.HasFlag(x.Level) && (x.Message.Contains($" {text} ") ||
|
||||
x.Message.StartsWith($"{text} ") ||
|
||||
x.Message.EndsWith($" {text}") ||
|
||||
(x.Message.StartsWith(text) && x.Message.EndsWith(text)) ||
|
||||
(useRegularExp && Regex.IsMatch(x.Message, text))));
|
||||
}
|
||||
|
||||
if(!matchCase && matchWholeWord)
|
||||
{
|
||||
return searchResult.Where(x => (level.HasFlag(x.Level) && (x.Message.Contains($" {text} ", StringComparison.OrdinalIgnoreCase) ||
|
||||
x.Message.StartsWith($"{text} ", StringComparison.OrdinalIgnoreCase) ||
|
||||
x.Message.EndsWith($" {text}", StringComparison.OrdinalIgnoreCase) ||
|
||||
(x.Message.StartsWith(text, StringComparison.OrdinalIgnoreCase) &&
|
||||
x.Message.EndsWith(text, StringComparison.OrdinalIgnoreCase)))) ||
|
||||
(useRegularExp && Regex.IsMatch(x.Message.ToUpper(), text, RegexOptions.IgnoreCase)));
|
||||
}
|
||||
|
||||
return searchResult;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,101 @@
|
||||
//******************************************************************************//
|
||||
// FileWatcher.cs
|
||||
// 12/4/2023
|
||||
//
|
||||
// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
// PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
// AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
// UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
// RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
// CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
// OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
// COMPANY.
|
||||
//
|
||||
// THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
//
|
||||
// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
//
|
||||
// WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
// EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
// BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
// 120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
// 730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
// OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
// LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
// BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
// APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
// PENALTIES.
|
||||
//
|
||||
// DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
// FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
// INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
// DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
// RECONSTRUCTION OF THE DOCUMENT.
|
||||
// POC: Alex Kravchenko (1118268)
|
||||
//******************************************************************************//
|
||||
using Raytheon.LogDashboard.Model;
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Raytheon.LogDashboard.Helpers
|
||||
{
|
||||
public class FileWatcher
|
||||
{
|
||||
private CancellationTokenSource cancellationToken;
|
||||
|
||||
public string FilePath { get; set; }
|
||||
|
||||
public long Position { get; set; }
|
||||
|
||||
public LogTemplate Template { get; set; }
|
||||
|
||||
public ImportLogFile ImportLogFile { get; set; }
|
||||
|
||||
public event EventHandler<FileWatcher> FileChanged;
|
||||
|
||||
/// <summary>
|
||||
/// starts watching the file for changes with hard-coded one sec interval
|
||||
/// </summary>
|
||||
public void StartWatch()
|
||||
{
|
||||
cancellationToken = new CancellationTokenSource();
|
||||
|
||||
Task.Run(() =>
|
||||
{
|
||||
while(true)
|
||||
{
|
||||
if(cancellationToken.Token.IsCancellationRequested)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
long currentLength;
|
||||
using(FileStream stream = File.Open(FilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
|
||||
{
|
||||
currentLength = stream.Length;
|
||||
}
|
||||
|
||||
if(currentLength > Position)
|
||||
{
|
||||
OnFileChanged(this);
|
||||
}
|
||||
|
||||
Position = currentLength;
|
||||
Thread.Sleep(1000);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public void StopWatch()
|
||||
{
|
||||
cancellationToken.Cancel();
|
||||
}
|
||||
|
||||
protected virtual void OnFileChanged(FileWatcher fileWatcher)
|
||||
{
|
||||
FileChanged?.Invoke(this, fileWatcher);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,255 @@
|
||||
//******************************************************************************//
|
||||
// SearchableTextControl.cs
|
||||
// 12/4/2023
|
||||
//
|
||||
// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
// PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
// AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
// UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
// RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
// CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
// OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
// COMPANY.
|
||||
//
|
||||
// THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
//
|
||||
// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
//
|
||||
// WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
// EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
// BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
// 120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
// 730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
// OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
// LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
// BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
// APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
// PENALTIES.
|
||||
//
|
||||
// DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
// FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
// INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
// DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
// RECONSTRUCTION OF THE DOCUMENT.
|
||||
// POC: Alex Kravchenko (1118268)
|
||||
//******************************************************************************//
|
||||
|
||||
// Ignore Spelling: Searchable
|
||||
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Documents;
|
||||
using System.Windows.Media;
|
||||
using System.Windows;
|
||||
|
||||
namespace Raytheon.LogDashboard.Helpers
|
||||
{
|
||||
public class SearchableTextControl : Control
|
||||
{
|
||||
static SearchableTextControl()
|
||||
{
|
||||
DefaultStyleKeyProperty.OverrideMetadata(typeof(SearchableTextControl),
|
||||
new FrameworkPropertyMetadata(typeof(SearchableTextControl)));
|
||||
}
|
||||
|
||||
#region DependencyProperties
|
||||
|
||||
/// <summary>
|
||||
/// Text sandbox which is used to get or set the value from a dependency property.
|
||||
/// </summary>
|
||||
public string Text
|
||||
{
|
||||
get => (string)GetValue(TextProperty);
|
||||
set => SetValue(TextProperty, value);
|
||||
}
|
||||
|
||||
|
||||
// Real implementation about TextProperty which registers a dependency property with
|
||||
// the specified property name, property type, owner type, and property metadata.
|
||||
public static readonly DependencyProperty TextProperty =
|
||||
DependencyProperty.Register("Text", typeof(string), typeof(SearchableTextControl),
|
||||
new UIPropertyMetadata(string.Empty,
|
||||
UpdateControlCallBack));
|
||||
|
||||
/// <summary>
|
||||
/// HighlightBackground sandbox which is used to get or set the value from a dependency property,
|
||||
/// if it gets a value,it should be forced to bind to a Brushes type.
|
||||
/// </summary>
|
||||
public Brush HighlightBackground
|
||||
{
|
||||
get => (Brush)GetValue(HighlightBackgroundProperty);
|
||||
set => SetValue(HighlightBackgroundProperty, value);
|
||||
}
|
||||
|
||||
|
||||
// Real implementation about HighlightBackgroundProperty which registers a dependency property
|
||||
// with the specified property name, property type, owner type, and property metadata.
|
||||
public static readonly DependencyProperty HighlightBackgroundProperty =
|
||||
DependencyProperty.Register("HighlightBackground", typeof(Brush), typeof(SearchableTextControl),
|
||||
new UIPropertyMetadata(Brushes.Yellow, UpdateControlCallBack));
|
||||
|
||||
/// <summary>
|
||||
/// HighlightForeground sandbox which is used to get or set the value from a dependency property,
|
||||
/// if it gets a value,it should be forced to bind to a Brushes type.
|
||||
/// </summary>
|
||||
public Brush HighlightForeground
|
||||
{
|
||||
get => (Brush)GetValue(HighlightForegroundProperty);
|
||||
set => SetValue(HighlightForegroundProperty, value);
|
||||
}
|
||||
|
||||
|
||||
// Real implementation about HighlightForegroundProperty which registers a dependency property with
|
||||
// the specified property name, property type, owner type, and property metadata.
|
||||
public static readonly DependencyProperty HighlightForegroundProperty =
|
||||
DependencyProperty.Register("HighlightForeground", typeof(Brush), typeof(SearchableTextControl),
|
||||
new UIPropertyMetadata(Brushes.Black, UpdateControlCallBack));
|
||||
|
||||
/// <summary>
|
||||
/// IsMatchCase sandbox which is used to get or set the value from a dependency property,
|
||||
/// if it gets a value,it should be forced to bind to a bool type.
|
||||
/// </summary>
|
||||
public bool IsMatchCase
|
||||
{
|
||||
get => (bool)GetValue(IsMatchCaseProperty);
|
||||
set => SetValue(IsMatchCaseProperty, value);
|
||||
}
|
||||
|
||||
// Real implementation about IsMatchCaseProperty which registers a dependency property with
|
||||
// the specified property name, property type, owner type, and property metadata.
|
||||
public static readonly DependencyProperty IsMatchCaseProperty =
|
||||
DependencyProperty.Register("IsMatchCase", typeof(bool), typeof(SearchableTextControl),
|
||||
new UIPropertyMetadata(true, UpdateControlCallBack));
|
||||
|
||||
/// <summary>
|
||||
/// IsHighlight sandbox which is used to get or set the value from a dependency property,
|
||||
/// if it gets a value,it should be forced to bind to a bool type.
|
||||
/// </summary>
|
||||
public bool IsHighlight
|
||||
{
|
||||
get => (bool)GetValue(IsHighlightProperty);
|
||||
set => SetValue(IsHighlightProperty, value);
|
||||
}
|
||||
|
||||
// Real implementation about IsHighlightProperty which registers a dependency property with
|
||||
// the specified property name, property type, owner type, and property metadata.
|
||||
public static readonly DependencyProperty IsHighlightProperty =
|
||||
DependencyProperty.Register("IsHighlight", typeof(bool), typeof(SearchableTextControl),
|
||||
new UIPropertyMetadata(false, UpdateControlCallBack));
|
||||
|
||||
/// <summary>
|
||||
/// SearchText sandbox which is used to get or set the value from a dependency property,
|
||||
/// if it gets a value,it should be forced to bind to a string type.
|
||||
/// </summary>
|
||||
public string SearchText
|
||||
{
|
||||
get => (string)GetValue(SearchTextProperty);
|
||||
set => SetValue(SearchTextProperty, value);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Real implementation about SearchTextProperty which registers a dependency property with
|
||||
/// the specified property name, property type, owner type, and property metadata.
|
||||
/// </summary>
|
||||
public static readonly DependencyProperty SearchTextProperty =
|
||||
DependencyProperty.Register("SearchText", typeof(string), typeof(SearchableTextControl),
|
||||
new UIPropertyMetadata(string.Empty, UpdateControlCallBack));
|
||||
|
||||
/// <summary>
|
||||
/// Create a call back function which is used to invalidate the rendering of the element,
|
||||
/// and force a complete new layout pass.
|
||||
/// One such advanced scenario is if you are creating a PropertyChangedCallback for a
|
||||
/// dependency property that is not on a Freezable or FrameworkElement derived class that
|
||||
/// still influences the layout when it changes.
|
||||
/// </summary>
|
||||
private static void UpdateControlCallBack(DependencyObject d, DependencyPropertyChangedEventArgs e)
|
||||
{
|
||||
SearchableTextControl obj = d as SearchableTextControl;
|
||||
obj.InvalidateVisual();
|
||||
}
|
||||
#endregion
|
||||
|
||||
/// <summary>
|
||||
/// override the OnRender method which is used to search for the keyword and highlight
|
||||
/// it when the operation gets the result.
|
||||
/// </summary>
|
||||
protected override void OnRender(DrawingContext drawingContext)
|
||||
{
|
||||
// Define a TextBlock to hold the search result.
|
||||
TextBlock displayTextBlock = Template.FindName("PART_TEXT", this) as TextBlock;
|
||||
|
||||
displayTextBlock.TextWrapping = TextWrapping.NoWrap;
|
||||
|
||||
if(string.IsNullOrEmpty(Text))
|
||||
{
|
||||
base.OnRender(drawingContext);
|
||||
|
||||
return;
|
||||
}
|
||||
if(!IsHighlight)
|
||||
{
|
||||
displayTextBlock.Text = Text;
|
||||
base.OnRender(drawingContext);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
displayTextBlock.Inlines.Clear();
|
||||
string searchstring = IsMatchCase ? SearchText : SearchText.ToUpper();
|
||||
|
||||
string compareText = IsMatchCase ? Text : Text.ToUpper();
|
||||
string displayText = Text;
|
||||
|
||||
Run run;
|
||||
while(!string.IsNullOrEmpty(searchstring) && compareText.IndexOf(searchstring) >= 0)
|
||||
{
|
||||
int position = compareText.IndexOf(searchstring);
|
||||
run = GenerateRun(displayText.Substring(0, position), false);
|
||||
|
||||
if(run != null)
|
||||
{
|
||||
displayTextBlock.Inlines.Add(run);
|
||||
}
|
||||
|
||||
run = GenerateRun(displayText.Substring(position, searchstring.Length), true);
|
||||
|
||||
if(run != null)
|
||||
{
|
||||
displayTextBlock.Inlines.Add(run);
|
||||
}
|
||||
|
||||
compareText = compareText.Substring(position + searchstring.Length);
|
||||
displayText = displayText.Substring(position + searchstring.Length);
|
||||
}
|
||||
|
||||
run = GenerateRun(displayText, false);
|
||||
|
||||
if(run != null)
|
||||
{
|
||||
displayTextBlock.Inlines.Add(run);
|
||||
}
|
||||
|
||||
base.OnRender(drawingContext);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Set inline-level flow content element intended to contain a run of formatted or unformatted
|
||||
/// text into your background and foreground setting.
|
||||
/// </summary>
|
||||
private Run GenerateRun(string searchedString, bool isHighlight)
|
||||
{
|
||||
if(!string.IsNullOrEmpty(searchedString))
|
||||
{
|
||||
Run run = new Run(searchedString)
|
||||
{
|
||||
Background = isHighlight ? HighlightBackground : Background,
|
||||
Foreground = isHighlight ? HighlightForeground : Foreground,
|
||||
|
||||
// Set the source text with the style which is Bold.
|
||||
FontWeight = isHighlight ? FontWeights.Bold : FontWeights.Normal,
|
||||
};
|
||||
return run;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,298 @@
|
||||
//******************************************************************************//
|
||||
// StringExtensions.cs
|
||||
// 12/4/2023
|
||||
//
|
||||
// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
// PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
// AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
// UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
// RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
// CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
// OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
// COMPANY.
|
||||
//
|
||||
// THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
//
|
||||
// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
//
|
||||
// WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
// EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
// BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
// 120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
// 730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
// OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
// LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
// BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
// APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
// PENALTIES.
|
||||
//
|
||||
// DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
// FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
// INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
// DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
// RECONSTRUCTION OF THE DOCUMENT.
|
||||
// POC: Alex Kravchenko (1118268)
|
||||
//******************************************************************************//
|
||||
using System;
|
||||
using System.Globalization;
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
namespace Raytheon.LogDashboard.Helpers
|
||||
{
|
||||
|
||||
public static class StringExtensions
|
||||
{
|
||||
/// <summary>
|
||||
/// takes the left of the string from given index
|
||||
/// </summary>
|
||||
/// <param name="value"></param>
|
||||
/// <param name="maxLength"></param>
|
||||
/// <returns></returns>
|
||||
public static string Left(this string value, int maxLength)
|
||||
{
|
||||
if(string.IsNullOrEmpty(value))
|
||||
{
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
maxLength = Math.Abs(maxLength);
|
||||
|
||||
return (value.Length <= maxLength ? value : value.Substring(0, maxLength));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// takes a left of a string from given character
|
||||
/// </summary>
|
||||
/// <param name="value"></param>
|
||||
/// <param name="character"></param>
|
||||
/// <returns></returns>
|
||||
public static string LeftFrom(this string value, char character)
|
||||
{
|
||||
if(string.IsNullOrEmpty(value))
|
||||
{
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
int index = value.IndexOf(character);
|
||||
|
||||
if(index == -1)
|
||||
{
|
||||
return value;
|
||||
}
|
||||
|
||||
return value.Substring(0, index);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// takes a left of a string from given string
|
||||
/// </summary>
|
||||
/// <param name="value"></param>
|
||||
/// <param name="characters"></param>
|
||||
/// <returns></returns>
|
||||
public static string LeftFrom(this string value, string characters)
|
||||
{
|
||||
if(string.IsNullOrEmpty(value))
|
||||
{
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
int index = value.IndexOf(characters);
|
||||
|
||||
if(index == -1)
|
||||
{
|
||||
return value;
|
||||
}
|
||||
|
||||
return value.Substring(0, index);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// takes a left of a string from given regular expression
|
||||
/// </summary>
|
||||
/// <param name="value"></param>
|
||||
/// <param name="regex"></param>
|
||||
/// <returns></returns>
|
||||
public static string LeftFromRegex(this string value, string regex)
|
||||
{
|
||||
if(string.IsNullOrEmpty(value))
|
||||
{
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
Match match = Regex.Match(value, regex);
|
||||
|
||||
if(!match.Success)
|
||||
{
|
||||
return value;
|
||||
}
|
||||
|
||||
return value.Substring(0, match.Index);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// takes a right of a string from given length
|
||||
/// </summary>
|
||||
/// <param name="value"></param>
|
||||
/// <param name="length"></param>
|
||||
/// <returns></returns>
|
||||
public static string Right(this string value, int length)
|
||||
{
|
||||
if(string.IsNullOrEmpty(value))
|
||||
{
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
return value.Length <= length ? value : value.Substring(value.Length - length);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// takes a right of a string from given character
|
||||
/// </summary>
|
||||
/// <param name="value"></param>
|
||||
/// <param name="character"></param>
|
||||
/// <returns></returns>
|
||||
public static string RightFrom(this string value, char character)
|
||||
{
|
||||
if(string.IsNullOrEmpty(value))
|
||||
{
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
int index = value.LastIndexOf(character);
|
||||
|
||||
if(index == -1)
|
||||
{
|
||||
return value;
|
||||
}
|
||||
|
||||
return value.Substring(index + 1);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// takes a right of a string from given string including that string
|
||||
/// </summary>
|
||||
/// <param name="value"></param>
|
||||
/// <param name="characters"></param>
|
||||
/// <returns></returns>
|
||||
public static string RightFrom(this string value, string characters)
|
||||
{
|
||||
if(string.IsNullOrEmpty(value))
|
||||
{
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
int index = value.LastIndexOf(characters);
|
||||
|
||||
if(index == -1)
|
||||
{
|
||||
return value;
|
||||
}
|
||||
|
||||
return value.Substring(index);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// takes a right of a string from given string not including the string
|
||||
/// </summary>
|
||||
/// <param name="value"></param>
|
||||
/// <param name="characters"></param>
|
||||
/// <returns></returns>
|
||||
public static string RightAfter(this string value, string characters)
|
||||
{
|
||||
if(string.IsNullOrEmpty(value))
|
||||
{
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
int index = value.LastIndexOf(characters);
|
||||
|
||||
if(index == -1)
|
||||
{
|
||||
return value;
|
||||
}
|
||||
|
||||
if(value.Length > index + characters.Length)
|
||||
{
|
||||
return value.Substring(index + characters.Length);
|
||||
}
|
||||
else
|
||||
{
|
||||
return string.Empty;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// takes a right of a string form given regular expression
|
||||
/// </summary>
|
||||
/// <param name="value"></param>
|
||||
/// <param name="regex"></param>
|
||||
/// <returns></returns>
|
||||
public static string RightFromRegex(this string value, string regex)
|
||||
{
|
||||
if(string.IsNullOrEmpty(value))
|
||||
{
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
Match match = Regex.Match(value, regex);
|
||||
|
||||
if(!match.Success)
|
||||
{
|
||||
return value;
|
||||
}
|
||||
|
||||
return value.Substring(match.Index + match.Length);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// returns the first match of the regular expression
|
||||
/// </summary>
|
||||
/// <param name="input"></param>
|
||||
/// <param name="pattern"></param>
|
||||
/// <returns></returns>
|
||||
public static string GetFirstMatch(this string input, string pattern)
|
||||
{
|
||||
var match = Regex.Match(input, pattern);
|
||||
return match.Groups[0].Value;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// reads the next value after provided identifier
|
||||
/// for example:
|
||||
/// in the string RESULT=123 and identifier = RESULT this function returns 123
|
||||
/// </summary>
|
||||
/// <param name="input"></param>
|
||||
/// <param name="identifier"></param>
|
||||
/// <returns></returns>
|
||||
public static T GetValueAfterIdentifier<T>(this string input, string identifier) => TypeConverter.ChangeType<T>(GetFirstMatch(input, $"(?<={identifier}=)[^ ]+|$"));
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// checks for numeric value
|
||||
/// </summary>
|
||||
/// <param name="input"></param>
|
||||
/// <returns></returns>
|
||||
public static bool IsNumeric(this string input)
|
||||
{
|
||||
if(string.IsNullOrEmpty(input))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return Regex.IsMatch(input.Trim(), @"^[\d.-]+$");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// converts string to Pascal Case
|
||||
/// </summary>
|
||||
/// <param name="text"></param>
|
||||
/// <returns></returns>
|
||||
public static string ToPascalCase(this string text)
|
||||
{
|
||||
string yourString = text.ToLower().Replace("_", " ");
|
||||
TextInfo info = CultureInfo.CurrentCulture.TextInfo;
|
||||
return info.ToTitleCase(yourString).Replace(" ", string.Empty);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,136 @@
|
||||
//******************************************************************************//
|
||||
// TVIExtender.cs
|
||||
// 12/4/2023
|
||||
//
|
||||
// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
// PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
// AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
// UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
// RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
// CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
// OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
// COMPANY.
|
||||
//
|
||||
// THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
//
|
||||
// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
//
|
||||
// WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
// EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
// BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
// 120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
// 730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
// OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
// LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
// BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
// APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
// PENALTIES.
|
||||
//
|
||||
// DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
// FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
// INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
// DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
// RECONSTRUCTION OF THE DOCUMENT.
|
||||
// POC: Alex Kravchenko (1118268)
|
||||
//******************************************************************************//
|
||||
using System.Windows.Controls.Primitives;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows;
|
||||
|
||||
namespace Raytheon.LogDashboard.Helpers
|
||||
{
|
||||
public class TVIExtender
|
||||
{
|
||||
private TreeViewItem item;
|
||||
|
||||
public static DependencyProperty UseExtenderProperty =
|
||||
DependencyProperty.RegisterAttached("UseExtender", typeof(bool), typeof(TVIExtender),
|
||||
new PropertyMetadata(false, OnChangedUseExtender));
|
||||
|
||||
public static bool GetUseExtender(DependencyObject sender)
|
||||
{
|
||||
return (bool)sender.GetValue(UseExtenderProperty);
|
||||
}
|
||||
|
||||
public static void SetUseExtender(DependencyObject sender, bool useExtender)
|
||||
{
|
||||
sender.SetValue(UseExtenderProperty, useExtender);
|
||||
}
|
||||
|
||||
private static void OnChangedUseExtender(DependencyObject sender, DependencyPropertyChangedEventArgs e)
|
||||
{
|
||||
if(sender is TreeViewItem item)
|
||||
{
|
||||
if((bool)e.NewValue)
|
||||
{
|
||||
if(item.ReadLocalValue(ItemExtenderProperty) == DependencyProperty.UnsetValue)
|
||||
{
|
||||
TVIExtender extender = new TVIExtender(item);
|
||||
item.SetValue(ItemExtenderProperty, extender);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if(item.ReadLocalValue(ItemExtenderProperty) != DependencyProperty.UnsetValue)
|
||||
{
|
||||
TVIExtender extender = (TVIExtender)item.ReadLocalValue(ItemExtenderProperty);
|
||||
extender.Detach();
|
||||
item.SetValue(ItemExtenderProperty, DependencyProperty.UnsetValue);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static DependencyProperty ItemExtenderProperty =
|
||||
DependencyProperty.RegisterAttached("ItemExtender", typeof(TVIExtender), typeof(TVIExtender));
|
||||
|
||||
public static DependencyProperty IsLastOneProperty =
|
||||
DependencyProperty.RegisterAttached("IsLastOne", typeof(bool), typeof(TVIExtender));
|
||||
|
||||
public static bool GetIsLastOne(DependencyObject sender)
|
||||
{
|
||||
return (bool)sender.GetValue(IsLastOneProperty);
|
||||
}
|
||||
|
||||
public static void SetIsLastOne(DependencyObject sender, bool isLastOne)
|
||||
{
|
||||
sender.SetValue(IsLastOneProperty, isLastOne);
|
||||
}
|
||||
|
||||
public TVIExtender(TreeViewItem item)
|
||||
{
|
||||
this.item = item;
|
||||
|
||||
ItemsControl ic = ItemsControl.ItemsControlFromItemContainer(this.item);
|
||||
ic.ItemContainerGenerator.ItemsChanged += OnItemsChangedItemContainerGenerator;
|
||||
|
||||
item.SetValue(IsLastOneProperty, ic.ItemContainerGenerator.IndexFromContainer(this.item) == ic.Items.Count - 1);
|
||||
}
|
||||
|
||||
private void OnItemsChangedItemContainerGenerator(object sender, ItemsChangedEventArgs e)
|
||||
{
|
||||
ItemsControl ic = ItemsControl.ItemsControlFromItemContainer(item);
|
||||
|
||||
if(null != ic)
|
||||
{
|
||||
item.SetValue(IsLastOneProperty, ic.ItemContainerGenerator.IndexFromContainer(item) == ic.Items.Count - 1);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void Detach()
|
||||
{
|
||||
if(item != null)
|
||||
{
|
||||
ItemsControl ic = ItemsControl.ItemsControlFromItemContainer(item);
|
||||
if(ic == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
ic.ItemContainerGenerator.ItemsChanged -= OnItemsChangedItemContainerGenerator;
|
||||
item = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,91 @@
|
||||
//******************************************************************************//
|
||||
// TypeConverter.cs
|
||||
// 12/4/2023
|
||||
//
|
||||
// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
// PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
// AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
// UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
// RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
// CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
// OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
// COMPANY.
|
||||
//
|
||||
// THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
//
|
||||
// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
//
|
||||
// WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
// EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
// BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
// 120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
// 730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
// OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
// LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
// BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
// APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
// PENALTIES.
|
||||
//
|
||||
// DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
// FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
// INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
// DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
// RECONSTRUCTION OF THE DOCUMENT.
|
||||
// POC: Alex Kravchenko (1118268)
|
||||
//******************************************************************************//
|
||||
using System;
|
||||
using System.ComponentModel;
|
||||
|
||||
namespace Raytheon.LogDashboard.Helpers
|
||||
{
|
||||
//
|
||||
// Summary:
|
||||
// type conversion utility with a special case for enums
|
||||
public static class TypeConverter
|
||||
{
|
||||
//
|
||||
// Summary:
|
||||
// special rule for enumeration when converting a type
|
||||
//
|
||||
// Parameters:
|
||||
// value:
|
||||
//
|
||||
// Type parameters:
|
||||
// T:
|
||||
public static T ChangeType<T>(object value)
|
||||
{
|
||||
if(!typeof(T).IsEnum)
|
||||
{
|
||||
return (T)ChangeType(typeof(T), value);
|
||||
}
|
||||
|
||||
return (T)Enum.Parse(typeof(T), value.ToString());
|
||||
}
|
||||
|
||||
//
|
||||
// Summary:
|
||||
// convert type with TypeDescriptor
|
||||
//
|
||||
// Parameters:
|
||||
// t:
|
||||
//
|
||||
// value:
|
||||
public static object ChangeType(Type t, object value)
|
||||
{
|
||||
return TypeDescriptor.GetConverter(t).ConvertFrom(value);
|
||||
}
|
||||
|
||||
//
|
||||
// Summary:
|
||||
// register type with the type descriptor for later conversion
|
||||
//
|
||||
// Type parameters:
|
||||
// T:
|
||||
//
|
||||
// TC:
|
||||
public static void RegisterTypeConverter<T, TC>() where TC : System.ComponentModel.TypeConverter
|
||||
{
|
||||
TypeDescriptor.AddAttributes(typeof(T), new TypeConverterAttribute(typeof(TC)));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,100 @@
|
||||
//******************************************************************************//
|
||||
// UnsafeNative.cs
|
||||
// 12/4/2023
|
||||
//
|
||||
// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
// PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
// AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
// UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
// RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
// CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
// OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
// COMPANY.
|
||||
//
|
||||
// THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
//
|
||||
// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
//
|
||||
// WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
// EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
// BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
// 120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
// 730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
// OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
// LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
// BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
// APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
// PENALTIES.
|
||||
//
|
||||
// DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
// FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
// INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
// DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
// RECONSTRUCTION OF THE DOCUMENT.
|
||||
// POC: Alex Kravchenko (1118268)
|
||||
//******************************************************************************//
|
||||
|
||||
// Ignore Spelling: COPYDATA
|
||||
|
||||
using System;
|
||||
using System.ComponentModel;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text;
|
||||
|
||||
namespace Raytheon.LogDashboard.Helpers
|
||||
{
|
||||
internal static class UnsafeNative
|
||||
{
|
||||
public const int WM_COPYDATA = 0x004A;
|
||||
|
||||
public static string GetMessage(int message, IntPtr lParam)
|
||||
{
|
||||
if(message == WM_COPYDATA)
|
||||
{
|
||||
try
|
||||
{
|
||||
var data = Marshal.PtrToStructure<CopyDataStruct>(lParam);
|
||||
string result = string.Copy(data.LpData);
|
||||
return result;
|
||||
}
|
||||
catch
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public static void SendMessage(IntPtr hwnd, string message)
|
||||
{
|
||||
byte[] messageBytes = Encoding.Unicode.GetBytes(message); /* ANSII encoding */
|
||||
CopyDataStruct data = new CopyDataStruct
|
||||
{
|
||||
DwData = IntPtr.Zero,
|
||||
LpData = message,
|
||||
CbData = messageBytes.Length + 1 /* +1 because of \0 string termination */
|
||||
};
|
||||
|
||||
if(SendMessage(hwnd, WM_COPYDATA, IntPtr.Zero, ref data) != 0)
|
||||
{
|
||||
throw new Win32Exception(Marshal.GetLastWin32Error());
|
||||
}
|
||||
}
|
||||
|
||||
[DllImport("user32.dll")]
|
||||
public static extern bool SetForegroundWindow(IntPtr hWnd);
|
||||
|
||||
[DllImport("User32.dll", EntryPoint = "SendMessage")]
|
||||
private static extern int SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, ref CopyDataStruct lParam);
|
||||
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
private struct CopyDataStruct
|
||||
{
|
||||
public IntPtr DwData;
|
||||
public int CbData;
|
||||
[MarshalAs(UnmanagedType.LPWStr)]
|
||||
public string LpData;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,84 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFrameworks>net472;net48</TargetFrameworks>
|
||||
<AssemblyName>Raytheon.LogDashboardLib</AssemblyName>
|
||||
<RootNamespace>Raytheon.LogDashboard</RootNamespace>
|
||||
<Company>Raytheon Technologies</Company>
|
||||
<Product>Logging Dashboard Application</Product>
|
||||
<Authors>Specialty Engineering</Authors>
|
||||
<Copyright>Raytheon Technologies</Copyright>
|
||||
<GenerateResourceUsePreserializedResources>true</GenerateResourceUsePreserializedResources>
|
||||
<Version>1.3.10</Version>
|
||||
<AssemblyVersion>$(Version)</AssemblyVersion>
|
||||
<FileVersion>$(Version)</FileVersion>
|
||||
<UseWPF>true</UseWPF>
|
||||
<ApplicationIcon>Resources\LogDashboard.ico</ApplicationIcon>
|
||||
<GeneratePackageOnBuild>True</GeneratePackageOnBuild>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<None Remove="Resources\Settings.png" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Page Remove="Styles\DrawingImages.xaml" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Content Include="Resources\LogDashboard.ico" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Resource Include="Styles\DrawingImages.xaml" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="MahApps.Metro" Version="2.4.10" />
|
||||
<PackageReference Include="MahApps.Metro.Resources" Version="0.6.1" />
|
||||
<PackageReference Include="MvvmLight" Version="5.4.1.1" />
|
||||
<PackageReference Include="NLog" Version="5.0.0" />
|
||||
<PackageReference Include="Raytheon.Configuration" Version="2.6.1" />
|
||||
<PackageReference Include="System.Resources.Extensions" Version="8.0.0" />
|
||||
<PackageReference Include="WindowsAPICodePack-Shell" Version="1.1.1" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Reference Include="PresentationCore" />
|
||||
<Reference Include="PresentationFramework" />
|
||||
<Reference Include="System.Deployment" />
|
||||
<Reference Include="System.Xml" />
|
||||
<Reference Include="System.Xml.Linq" />
|
||||
<Reference Include="System.Windows.Forms" />
|
||||
<Reference Include="System.Windows.Interactivity" />
|
||||
<Reference Include="System.ServiceModel" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Compile Update="Resources\Resource1.Designer.cs">
|
||||
<DesignTime>True</DesignTime>
|
||||
<AutoGen>True</AutoGen>
|
||||
<DependentUpon>Resource1.resx</DependentUpon>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Resource Include="Resources\Settings.png" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<EmbeddedResource Update="Resources\Resource1.resx">
|
||||
<Generator>ResXFileCodeGenerator</Generator>
|
||||
<LastGenOutput>Resource1.Designer.cs</LastGenOutput>
|
||||
</EmbeddedResource>
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<None Update="ReleaseNotes.xml">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
|
||||
|
||||
|
||||
</Project>
|
||||
@@ -0,0 +1,44 @@
|
||||
//******************************************************************************//
|
||||
// CheckBoxId.cs
|
||||
// 12/4/2023
|
||||
//
|
||||
// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
// PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
// AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
// UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
// RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
// CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
// OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
// COMPANY.
|
||||
//
|
||||
// THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
//
|
||||
// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
//
|
||||
// WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
// EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
// BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
// 120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
// 730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
// OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
// LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
// BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
// APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
// PENALTIES.
|
||||
//
|
||||
// DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
// FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
// INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
// DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
// RECONSTRUCTION OF THE DOCUMENT.
|
||||
// POC: Alex Kravchenko (1118268)
|
||||
//******************************************************************************//
|
||||
// Ignore Spelling: Сheck
|
||||
|
||||
namespace Raytheon.LogDashboard.Model
|
||||
{
|
||||
public struct CheckBoxId
|
||||
{
|
||||
public static string CurrentСheckBoxId { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
//******************************************************************************//
|
||||
// DashboardLogLevel.cs
|
||||
// 12/4/2023
|
||||
//
|
||||
// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
// PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
// AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
// UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
// RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
// CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
// OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
// COMPANY.
|
||||
//
|
||||
// THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
//
|
||||
// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
//
|
||||
// WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
// EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
// BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
// 120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
// 730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
// OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
// LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
// BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
// APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
// PENALTIES.
|
||||
//
|
||||
// DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
// FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
// INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
// DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
// RECONSTRUCTION OF THE DOCUMENT.
|
||||
// POC: Alex Kravchenko (1118268)
|
||||
//******************************************************************************//
|
||||
using System;
|
||||
|
||||
namespace Raytheon.LogDashboard.Model
|
||||
{
|
||||
[Flags]
|
||||
public enum DashboardLogLevel
|
||||
{
|
||||
Trace = 1 | Debug | Info | Warn | Error | Fatal,
|
||||
Debug = 2 | Info | Warn | Error | Fatal,
|
||||
Info = 4 | Warn | Error | Fatal,
|
||||
Warn = 8 | Error | Fatal,
|
||||
Error = 16 | Fatal,
|
||||
Fatal = 32,
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,56 @@
|
||||
//******************************************************************************//
|
||||
// IgnoredIPAddress.cs
|
||||
// 12/4/2023
|
||||
//
|
||||
// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
// PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
// AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
// UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
// RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
// CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
// OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
// COMPANY.
|
||||
//
|
||||
// THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
//
|
||||
// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
//
|
||||
// WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
// EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
// BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
// 120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
// 730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
// OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
// LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
// BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
// APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
// PENALTIES.
|
||||
//
|
||||
// DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
// FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
// INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
// DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
// RECONSTRUCTION OF THE DOCUMENT.
|
||||
// POC: Alex Kravchenko (1118268)
|
||||
//******************************************************************************//
|
||||
using GalaSoft.MvvmLight;
|
||||
|
||||
namespace Raytheon.LogDashboard.Model
|
||||
{
|
||||
public class IgnoredIPAddr : ObservableObject
|
||||
{
|
||||
private string ip;
|
||||
public string IP
|
||||
{
|
||||
get => ip;
|
||||
set { Set(() => IP, ref ip, value); }
|
||||
}
|
||||
|
||||
private bool isActive = true;
|
||||
public bool IsActive
|
||||
{
|
||||
get => isActive;
|
||||
set { Set(() => IsActive, ref isActive, value); }
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
//******************************************************************************//
|
||||
// ImportLogFile.cs
|
||||
// 12/4/2023
|
||||
//
|
||||
// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
// PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
// AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
// UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
// RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
// CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
// OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
// COMPANY.
|
||||
//
|
||||
// THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
//
|
||||
// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
//
|
||||
// WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
// EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
// BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
// 120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
// 730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
// OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
// LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
// BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
// APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
// PENALTIES.
|
||||
//
|
||||
// DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
// FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
// INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
// DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
// RECONSTRUCTION OF THE DOCUMENT.
|
||||
// POC: Alex Kravchenko (1118268)
|
||||
//******************************************************************************//
|
||||
using GalaSoft.MvvmLight;
|
||||
|
||||
namespace Raytheon.LogDashboard.Model
|
||||
{
|
||||
public class ImportLogFile : ObservableObject
|
||||
{
|
||||
public string FileName { get; set; }
|
||||
public string FilePath { get; set; }
|
||||
|
||||
private double process = 0;
|
||||
public double Process
|
||||
{
|
||||
get => process;
|
||||
set { Set(() => Process, ref process, value); }
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,76 @@
|
||||
//******************************************************************************//
|
||||
// ImportTemplateParameters.cs
|
||||
// 12/4/2023
|
||||
//
|
||||
// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
// PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
// AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
// UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
// RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
// CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
// OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
// COMPANY.
|
||||
//
|
||||
// THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
//
|
||||
// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
//
|
||||
// WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
// EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
// BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
// 120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
// 730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
// OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
// LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
// BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
// APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
// PENALTIES.
|
||||
//
|
||||
// DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
// FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
// INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
// DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
// RECONSTRUCTION OF THE DOCUMENT.
|
||||
// POC: Alex Kravchenko (1118268)
|
||||
//******************************************************************************//
|
||||
namespace Raytheon.LogDashboard.Model
|
||||
{
|
||||
public enum ImportTemplateParameters
|
||||
{
|
||||
// main
|
||||
level,
|
||||
logger,
|
||||
message,
|
||||
exception,
|
||||
newline,
|
||||
oneexception,
|
||||
var,
|
||||
|
||||
// date and time
|
||||
date,
|
||||
longdate,
|
||||
shortdate,
|
||||
ticks,
|
||||
time,
|
||||
eptstime,
|
||||
errorloggertime,
|
||||
|
||||
//Call site and stack traces
|
||||
сallsite,
|
||||
callsitelinenumber,
|
||||
stacktrace,
|
||||
|
||||
//Processes, threads and assemblies
|
||||
threadid,
|
||||
threadname,
|
||||
processid,
|
||||
processinfo,
|
||||
processname,
|
||||
processtime,
|
||||
appdomain,
|
||||
hostname,
|
||||
machinename,
|
||||
|
||||
other,
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,119 @@
|
||||
//******************************************************************************//
|
||||
// LogMessage.cs
|
||||
// 12/4/2023
|
||||
//
|
||||
// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
// PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
// AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
// UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
// RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
// CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
// OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
// COMPANY.
|
||||
//
|
||||
// THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
//
|
||||
// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
//
|
||||
// WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
// EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
// BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
// 120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
// 730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
// OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
// LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
// BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
// APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
// PENALTIES.
|
||||
//
|
||||
// DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
// FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
// INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
// DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
// RECONSTRUCTION OF THE DOCUMENT.
|
||||
// POC: Alex Kravchenko (1118268)
|
||||
//******************************************************************************//
|
||||
using GalaSoft.MvvmLight;
|
||||
using System;
|
||||
using System.Windows.Media;
|
||||
|
||||
namespace Raytheon.LogDashboard.Model
|
||||
{
|
||||
public class LogMessage : ViewModelBase, ICloneable
|
||||
{
|
||||
public LogMessage()
|
||||
{
|
||||
toggleMark.Freeze();
|
||||
}
|
||||
|
||||
public ulong SequenceNumber { get; set; }
|
||||
|
||||
public DateTime Time { get; set; }
|
||||
|
||||
public DashboardLogLevel Level { get; set; }
|
||||
|
||||
public string Logger { get; set; } = string.Empty;
|
||||
|
||||
public int Thread { get; set; }
|
||||
|
||||
public string ThreadName { get; set; }
|
||||
|
||||
public string Message { get; set; }
|
||||
|
||||
public string ExecutableName { get; set; }
|
||||
|
||||
public string Address { get; set; }
|
||||
|
||||
public int Port { get; set; }
|
||||
|
||||
public string ExceptionString { get; set; }
|
||||
|
||||
public int? ProcessID { get; set; }
|
||||
|
||||
public SolidColorBrush Color { get; set; }
|
||||
|
||||
public string FullPath
|
||||
{
|
||||
get
|
||||
{
|
||||
if(string.IsNullOrEmpty(ExecutableName))
|
||||
{
|
||||
return Address + "." + Logger;
|
||||
}
|
||||
|
||||
return Address + "." + ExecutableName + "." + Logger;
|
||||
}
|
||||
}
|
||||
|
||||
private SolidColorBrush toggleMark = new SolidColorBrush(Colors.Transparent);
|
||||
public SolidColorBrush ToggleMark
|
||||
{
|
||||
get => toggleMark;
|
||||
set
|
||||
{
|
||||
Set(() => ToggleMark, ref toggleMark, value);
|
||||
toggleMark.Freeze();
|
||||
}
|
||||
}
|
||||
|
||||
public object Clone()
|
||||
{
|
||||
return new LogMessage
|
||||
{
|
||||
SequenceNumber = SequenceNumber,
|
||||
Address = Address,
|
||||
Port = Port,
|
||||
ExecutableName = ExecutableName,
|
||||
Level = Level,
|
||||
Logger = Logger,
|
||||
Message = Message,
|
||||
Thread = Thread,
|
||||
ThreadName = ThreadName,
|
||||
Time = Time,
|
||||
ExceptionString = ExceptionString,
|
||||
Color = Color,
|
||||
ProcessID = ProcessID,
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,237 @@
|
||||
//******************************************************************************//
|
||||
// LogTemplate.cs
|
||||
// 12/4/2023
|
||||
//
|
||||
// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
// PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
// AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
// UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
// RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
// CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
// OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
// COMPANY.
|
||||
//
|
||||
// THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
//
|
||||
// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
//
|
||||
// WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
// EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
// BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
// 120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
// 730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
// OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
// LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
// BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
// APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
// PENALTIES.
|
||||
//
|
||||
// DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
// FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
// INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
// DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
// RECONSTRUCTION OF THE DOCUMENT.
|
||||
// POC: Alex Kravchenko (1118268)
|
||||
//******************************************************************************//
|
||||
using GalaSoft.MvvmLight.Messaging;
|
||||
using Raytheon.LogDashboard.Helpers;
|
||||
using Raytheon.LogDashboard.ViewModel;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
using System.Windows;
|
||||
|
||||
namespace Raytheon.LogDashboard.Model
|
||||
{
|
||||
public enum LogFileType
|
||||
{
|
||||
Undefined,
|
||||
Log4j,
|
||||
CSV,
|
||||
EPTS,
|
||||
ErrorLogger
|
||||
}
|
||||
|
||||
public class LogTemplate
|
||||
{
|
||||
public Dictionary<ImportTemplateParameters, int> TemplateParameters { get; } = new Dictionary<ImportTemplateParameters, int>();
|
||||
|
||||
public string Separator { get; set; } = ";";
|
||||
|
||||
public string Encoding { get; set; } = "UTF-8";
|
||||
|
||||
public LogFileType LogFileType { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// trying to detect template
|
||||
/// </summary>
|
||||
/// <param name="firstMessage"></param>
|
||||
/// <returns></returns>
|
||||
public bool TryGetLogTemplateByAutoDetect(string firstMessage)
|
||||
{
|
||||
if(string.IsNullOrWhiteSpace(firstMessage))
|
||||
{
|
||||
Messenger.Default.Send("An error occurred while trying to automatically match the message template.\nFirst Message is Empty", "DisplayCustomMessage");
|
||||
return false;
|
||||
}
|
||||
|
||||
if(TryDetectTemplate(firstMessage) == LogFileType.Undefined)
|
||||
{
|
||||
Messenger.Default.Send("An error occurred while trying to automatically match the message template.\nLog file type is undefined", "DisplayCustomMessage");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// trying to detect template
|
||||
/// </summary>
|
||||
/// <param name="log"></param>
|
||||
/// <returns></returns>
|
||||
public LogFileType TryDetectTemplate(string log)
|
||||
{
|
||||
LogFileType = LogFileType.Undefined;
|
||||
|
||||
if(log.StartsWith("<log4j"))
|
||||
{
|
||||
LogFileType = LogFileType.Log4j;
|
||||
}
|
||||
else if(log.ContainsAnyOfPattern(new string[] { "^-----", "^\\d{4}-\\d{2}-\\d{2}\\s\\d{2}:\\d{2}:\\d{2},\\d{3}" }))
|
||||
{
|
||||
LogFileType = LogFileType.EPTS;
|
||||
}
|
||||
else if(log.ContainsAnyOfPattern(new string[] {"^\\d{10}\\.\\d{3}"}))
|
||||
{
|
||||
LogFileType = LogFileType.ErrorLogger;
|
||||
}
|
||||
else
|
||||
{
|
||||
string[] logSplit = log.Split(';');
|
||||
if(logSplit.Length < 4)
|
||||
{
|
||||
logSplit = log.Split('|');
|
||||
Separator = "|";
|
||||
if(logSplit.Length < 3)
|
||||
{
|
||||
logSplit = log.Split(',');
|
||||
Separator = ",";
|
||||
}
|
||||
}
|
||||
|
||||
ImportTemplateParameters dataParameter = ImportTemplateParameters.date;
|
||||
|
||||
int dateTimeIndex = GetDateTimeIndex(logSplit, ref dataParameter);
|
||||
if(dateTimeIndex == -1)
|
||||
{
|
||||
return LogFileType.Undefined;
|
||||
}
|
||||
|
||||
var intIndexes = GetIntIndexes(logSplit);
|
||||
int logLevelIndex = GetLogLevelIndex(logSplit);
|
||||
if(dateTimeIndex == -1)
|
||||
{
|
||||
return LogFileType.Undefined;
|
||||
}
|
||||
|
||||
List<int> otherIndexes = new List<int>();
|
||||
|
||||
for(int i = 0; i < logSplit.Length; i++)
|
||||
{
|
||||
|
||||
if(i == dateTimeIndex || i == logLevelIndex || intIndexes.Contains(i))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if(!string.IsNullOrEmpty(logSplit[i]))
|
||||
{
|
||||
otherIndexes.Add(i);
|
||||
}
|
||||
}
|
||||
|
||||
if(otherIndexes.Count > 1)
|
||||
{
|
||||
TemplateParameters.Add(ImportTemplateParameters.logger, otherIndexes.First());
|
||||
}
|
||||
|
||||
TemplateParameters.Add(dataParameter, dateTimeIndex);
|
||||
TemplateParameters.Add(ImportTemplateParameters.level, logLevelIndex);
|
||||
|
||||
TemplateParameters.Add(ImportTemplateParameters.message, otherIndexes.Last());
|
||||
|
||||
if(intIndexes.Count > 0)
|
||||
{
|
||||
TemplateParameters.Add(ImportTemplateParameters.threadid, intIndexes.Last());
|
||||
}
|
||||
|
||||
LogFileType = LogFileType.CSV;
|
||||
|
||||
}
|
||||
|
||||
return LogFileType;
|
||||
}
|
||||
|
||||
private int GetDateTimeIndex(string[] logSplit, ref ImportTemplateParameters dateTemplateParameter)
|
||||
{
|
||||
int index = -1;
|
||||
for(int i = 0; i < logSplit.Length; i++)
|
||||
{
|
||||
string columnString = logSplit[i].Trim();
|
||||
|
||||
if(DateTime.TryParse(columnString, out DateTime date))
|
||||
{
|
||||
return i;
|
||||
}
|
||||
|
||||
if(DateTime.TryParseExact(columnString, "MM-dd-y HH:mm:ss.ffff", CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime dt))
|
||||
{
|
||||
dateTemplateParameter = ImportTemplateParameters.eptstime;
|
||||
return i;
|
||||
}
|
||||
// legacy Error Logger format
|
||||
if(DateTime.TryParseExact(columnString, "ddd MMM dd HH:mm:ss yyyy fff\\m\\s", null, DateTimeStyles.None, out dt))
|
||||
{
|
||||
dateTemplateParameter = ImportTemplateParameters.errorloggertime;
|
||||
return i;
|
||||
}
|
||||
|
||||
// TODO AK
|
||||
if(long.TryParse(columnString, out long tickDateTime))
|
||||
{
|
||||
DateTime dateFromTicks = new DateTime(tickDateTime);
|
||||
dateTemplateParameter = ImportTemplateParameters.ticks;
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return index;
|
||||
}
|
||||
|
||||
private List<int> GetIntIndexes(string[] logSplit)
|
||||
{
|
||||
List<int> indexes = new List<int>();
|
||||
for(int i = 0; i < logSplit.Length; i++)
|
||||
{
|
||||
if(logSplit[i].IsNumeric())
|
||||
{
|
||||
indexes.Add(i);
|
||||
}
|
||||
}
|
||||
return indexes;
|
||||
}
|
||||
|
||||
private int GetLogLevelIndex(string[] logSplit)
|
||||
{
|
||||
int index = -1;
|
||||
for(int i = 0; i < logSplit.Length; i++)
|
||||
{
|
||||
string line = logSplit[i]?.Trim();
|
||||
if(LogDashboardViewModel.LogTypeArray.Contains(line))
|
||||
{
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return index;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,92 @@
|
||||
//******************************************************************************//
|
||||
// LogTemplateItem.cs
|
||||
// 12/4/2023
|
||||
//
|
||||
// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
// PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
// AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
// UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
// RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
// CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
// OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
// COMPANY.
|
||||
//
|
||||
// THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
//
|
||||
// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
//
|
||||
// WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
// EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
// BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
// 120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
// 730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
// OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
// LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
// BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
// APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
// PENALTIES.
|
||||
//
|
||||
// DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
// FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
// INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
// DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
// RECONSTRUCTION OF THE DOCUMENT.
|
||||
// POC: Alex Kravchenko (1118268)
|
||||
//******************************************************************************//
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Runtime.Serialization;
|
||||
using System.Windows.Data;
|
||||
using System.Xml.Serialization;
|
||||
|
||||
namespace Raytheon.LogDashboard.Model
|
||||
{
|
||||
[Serializable]
|
||||
[DataContract]
|
||||
public class LogTemplateItem
|
||||
{
|
||||
public LogTemplateItemInfo SelectedTemplateParameter { get; set; }
|
||||
|
||||
public LogTemplateItem()
|
||||
{
|
||||
List<LogTemplateItemInfo> test = new List<LogTemplateItemInfo>
|
||||
{
|
||||
new LogTemplateItemInfo {Group = "Main", Parameter = ImportTemplateParameters.level},
|
||||
new LogTemplateItemInfo {Group = "Main", Parameter = ImportTemplateParameters.logger},
|
||||
new LogTemplateItemInfo {Group = "Main", Parameter = ImportTemplateParameters.message},
|
||||
new LogTemplateItemInfo {Group = "Main", Parameter = ImportTemplateParameters.exception},
|
||||
new LogTemplateItemInfo {Group = "Main", Parameter = ImportTemplateParameters.newline},
|
||||
new LogTemplateItemInfo {Group = "Main", Parameter = ImportTemplateParameters.oneexception},
|
||||
new LogTemplateItemInfo {Group = "Main", Parameter = ImportTemplateParameters.var},
|
||||
|
||||
new LogTemplateItemInfo {Group = "Date and Time", Parameter = ImportTemplateParameters.date},
|
||||
new LogTemplateItemInfo {Group = "Date and Time", Parameter = ImportTemplateParameters.longdate},
|
||||
new LogTemplateItemInfo {Group = "Date and Time", Parameter = ImportTemplateParameters.shortdate},
|
||||
new LogTemplateItemInfo {Group = "Date and Time", Parameter = ImportTemplateParameters.ticks},
|
||||
new LogTemplateItemInfo {Group = "Date and Time", Parameter = ImportTemplateParameters.time},
|
||||
|
||||
new LogTemplateItemInfo {Group = "Call Site and Stack Traces", Parameter = ImportTemplateParameters.сallsite},
|
||||
new LogTemplateItemInfo {Group = "Call Site and Stack Traces", Parameter = ImportTemplateParameters.callsitelinenumber},
|
||||
new LogTemplateItemInfo {Group = "Call Site and Stack Traces", Parameter = ImportTemplateParameters.stacktrace},
|
||||
|
||||
new LogTemplateItemInfo {Group = "Processes, Threads and Assemblies", Parameter = ImportTemplateParameters.threadid},
|
||||
new LogTemplateItemInfo {Group = "Processes, Threads and Assemblies", Parameter = ImportTemplateParameters.threadname},
|
||||
new LogTemplateItemInfo {Group = "Processes, Threads and Assemblies", Parameter = ImportTemplateParameters.processid},
|
||||
new LogTemplateItemInfo {Group = "Processes, Threads and Assemblies", Parameter = ImportTemplateParameters.processinfo},
|
||||
new LogTemplateItemInfo {Group = "Processes, Threads and Assemblies", Parameter = ImportTemplateParameters.processname},
|
||||
new LogTemplateItemInfo {Group = "Processes, Threads and Assemblies", Parameter = ImportTemplateParameters.processtime},
|
||||
new LogTemplateItemInfo {Group = "Processes, Threads and Assemblies", Parameter = ImportTemplateParameters.appdomain},
|
||||
new LogTemplateItemInfo {Group = "Processes, Threads and Assemblies", Parameter = ImportTemplateParameters.hostname},
|
||||
new LogTemplateItemInfo {Group = "Processes, Threads and Assemblies", Parameter = ImportTemplateParameters.machinename},
|
||||
|
||||
new LogTemplateItemInfo {Group = "Other", Parameter = ImportTemplateParameters.other},
|
||||
};
|
||||
|
||||
TemplateItems = new ListCollectionView(test);
|
||||
TemplateItems.GroupDescriptions.Add(new PropertyGroupDescription("Group"));
|
||||
}
|
||||
|
||||
[XmlIgnore]
|
||||
public ListCollectionView TemplateItems { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
//******************************************************************************//
|
||||
// LogTemplateItemInfo.cs
|
||||
// 12/4/2023
|
||||
//
|
||||
// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
// PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
// AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
// UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
// RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
// CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
// OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
// COMPANY.
|
||||
//
|
||||
// THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
//
|
||||
// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
//
|
||||
// WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
// EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
// BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
// 120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
// 730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
// OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
// LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
// BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
// APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
// PENALTIES.
|
||||
//
|
||||
// DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
// FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
// INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
// DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
// RECONSTRUCTION OF THE DOCUMENT.
|
||||
// POC: Alex Kravchenko (1118268)
|
||||
//******************************************************************************//
|
||||
using System;
|
||||
using System.Runtime.Serialization;
|
||||
|
||||
namespace Raytheon.LogDashboard.Model
|
||||
{
|
||||
[Serializable]
|
||||
[DataContract]
|
||||
public class LogTemplateItemInfo
|
||||
{
|
||||
public ImportTemplateParameters Parameter { get; set; }
|
||||
|
||||
public string Group { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,151 @@
|
||||
//******************************************************************************//
|
||||
// Node.cs
|
||||
// 12/4/2023
|
||||
//
|
||||
// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
// PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
// AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
// UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
// RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
// CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
// OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
// COMPANY.
|
||||
//
|
||||
// THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
//
|
||||
// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
//
|
||||
// WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
// EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
// BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
// 120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
// 730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
// OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
// LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
// BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
// APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
// PENALTIES.
|
||||
//
|
||||
// DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
// FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
// INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
// DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
// RECONSTRUCTION OF THE DOCUMENT.
|
||||
// POC: Alex Kravchenko (1118268)
|
||||
//******************************************************************************//
|
||||
using GalaSoft.MvvmLight;
|
||||
using System;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.Windows.Media;
|
||||
|
||||
namespace Raytheon.LogDashboard.Model
|
||||
{
|
||||
public class Node : ObservableObject
|
||||
{
|
||||
private string text;
|
||||
private bool? isChecked = true;
|
||||
private bool isExpanded;
|
||||
private bool isSelected = false;
|
||||
private string source = string.Empty;
|
||||
|
||||
public Node()
|
||||
{
|
||||
Id = Guid.NewGuid().ToString();
|
||||
toggleMark.Freeze();
|
||||
}
|
||||
|
||||
public Node(Node parent, string txt)
|
||||
{
|
||||
toggleMark.Freeze();
|
||||
Id = Guid.NewGuid().ToString();
|
||||
Parent = parent;
|
||||
Text = txt;
|
||||
|
||||
if(Parent != null && parent.Text != "Root")
|
||||
{
|
||||
IsExpanded = Parent.IsExpanded;
|
||||
|
||||
Logger = Parent.Logger + "." + Text;
|
||||
|
||||
if(!string.IsNullOrEmpty(Parent.Source))
|
||||
{
|
||||
Source = Parent.Source;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Logger = Text;
|
||||
}
|
||||
}
|
||||
|
||||
public ObservableCollection<Node> Children { get; } = new ObservableCollection<Node>();
|
||||
|
||||
public Node Parent { get; }
|
||||
|
||||
public bool? IsChecked
|
||||
{
|
||||
get => isChecked;
|
||||
set { Set(() => IsChecked, ref isChecked, value); }
|
||||
}
|
||||
|
||||
public string Text
|
||||
{
|
||||
get => text;
|
||||
set { Set(() => Text, ref text, value); }
|
||||
}
|
||||
|
||||
public string Logger { get; set; }
|
||||
public bool IsRoot { get; set; }
|
||||
|
||||
public bool IsExpanded
|
||||
{
|
||||
get => isExpanded;
|
||||
set { Set(() => IsExpanded, ref isExpanded, value); }
|
||||
}
|
||||
|
||||
private bool isVisible = true;
|
||||
public bool IsVisible
|
||||
{
|
||||
get => isVisible;
|
||||
set { Set(() => IsVisible, ref isVisible, value); }
|
||||
}
|
||||
|
||||
public string Source
|
||||
{
|
||||
get => source;
|
||||
set { Set(() => Source, ref source, value); }
|
||||
}
|
||||
|
||||
private SolidColorBrush toggleMark = new SolidColorBrush(Colors.Transparent);
|
||||
|
||||
public SolidColorBrush ToggleMark
|
||||
{
|
||||
get => toggleMark;
|
||||
set
|
||||
{
|
||||
Set(() => ToggleMark, ref toggleMark, value);
|
||||
toggleMark.Freeze();
|
||||
}
|
||||
}
|
||||
|
||||
public string Id { get; set; }
|
||||
|
||||
private void CheckChildNodes(ObservableCollection<Node> itemsChild, bool? isChecked)
|
||||
{
|
||||
foreach(Node item in itemsChild)
|
||||
{
|
||||
item.IsChecked = isChecked;
|
||||
if(item.Children.Count != 0)
|
||||
{
|
||||
CheckChildNodes(item.Children, isChecked);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public bool IsSelected
|
||||
{
|
||||
get => isSelected;
|
||||
set { Set(() => IsSelected, ref isSelected, value); }
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,365 @@
|
||||
//******************************************************************************//
|
||||
// Receiver.cs
|
||||
// 12/4/2023
|
||||
//
|
||||
// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
// PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
// AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
// UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
// RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
// CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
// OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
// COMPANY.
|
||||
//
|
||||
// THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
//
|
||||
// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
//
|
||||
// WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
// EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
// BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
// 120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
// 730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
// OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
// LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
// BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
// APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
// PENALTIES.
|
||||
//
|
||||
// DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
// FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
// INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
// DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
// RECONSTRUCTION OF THE DOCUMENT.
|
||||
// POC: Alex Kravchenko (1118268)
|
||||
//******************************************************************************//
|
||||
using GalaSoft.MvvmLight;
|
||||
using Raytheon.LogDashboard.Helpers;
|
||||
using Raytheon.LogDashboard.Parsers;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Linq;
|
||||
using System.Runtime.Serialization;
|
||||
using System.Windows.Media;
|
||||
using System.Xml.Serialization;
|
||||
|
||||
namespace Raytheon.LogDashboard.Model
|
||||
{
|
||||
public enum ReceiverType
|
||||
{
|
||||
[Description("UDP")]
|
||||
UDP,
|
||||
[Description("WCF Named Pipes")]
|
||||
WCF,
|
||||
[Description("Error Logger")]
|
||||
ErrorLogger,
|
||||
[Description("Windows Debug")]
|
||||
WinDebug
|
||||
}
|
||||
|
||||
public enum ErrorLoggerType
|
||||
{
|
||||
[Description("32 Bit Logger")]
|
||||
BIT_32,
|
||||
[Description("64 Bit Logger")]
|
||||
BIT_64
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
[DataContract]
|
||||
public class Receiver : ViewModelBase, ICloneable, IDisposable
|
||||
{
|
||||
[NonSerialized]
|
||||
private SolidColorBrush color = new SolidColorBrush(Colors.White);
|
||||
[DataMember(Name = "ColorString")]
|
||||
private string colorString;
|
||||
private int port = 0;
|
||||
private bool isActive = true;
|
||||
private string encoding = "UTF-8";
|
||||
private IEnumerable<string> receiverNames { get; set; }
|
||||
|
||||
public PacketsParser Parser { get; set; }
|
||||
|
||||
public Receiver(string name, string address, ReceiverType type, IEnumerable<string> receiverNames)
|
||||
{
|
||||
Parser = null;
|
||||
this.receiverNames = receiverNames;
|
||||
Name = GetUniqueName(name, 0);
|
||||
Address = address;
|
||||
ReceiverType = type;
|
||||
ColorString = "#FFFFFFFF";
|
||||
}
|
||||
|
||||
public Receiver(ReceiverSetting receiverSetting)
|
||||
{
|
||||
Name = receiverSetting.Name;
|
||||
ReceiverType = receiverSetting.ReceiverType;
|
||||
Address = receiverSetting.Address;
|
||||
Parser = null;
|
||||
Port = receiverSetting.Port;
|
||||
IsActive = receiverSetting.IsActive;
|
||||
Encoding = receiverSetting.Encoding;
|
||||
ColorString = receiverSetting.ColorString;
|
||||
IsAddressVisible = receiverSetting.IsAddressVisible;
|
||||
IsPortVisible = receiverSetting.IsPortVisible;
|
||||
IsHidden = receiverSetting.IsHidden;
|
||||
IsAutoSave = receiverSetting.IsAutoSave;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// sets the parser type plus sets port number for UDP parser
|
||||
/// </summary>
|
||||
/// <param name="parser"></param>
|
||||
/// <returns></returns>
|
||||
private ReceiverType DeriveTypeFromParser(PacketsParser parser)
|
||||
{
|
||||
switch(parser)
|
||||
{
|
||||
case UDPPacketsParser udp:
|
||||
Port = udp.Port;
|
||||
return ReceiverType.UDP;
|
||||
case WCFPacketsParser _:
|
||||
return ReceiverType.WCF;
|
||||
case ErrorLoggerPacketsParser _:
|
||||
return ReceiverType.ErrorLogger;
|
||||
case DebugMonitorParser _:
|
||||
return ReceiverType.WinDebug;
|
||||
default:
|
||||
return ReceiverType.UDP;
|
||||
}
|
||||
}
|
||||
|
||||
public bool IsHidden { get; set; }
|
||||
|
||||
private string name;
|
||||
public string Name
|
||||
{
|
||||
get => name;
|
||||
set { Set(() => Name, ref name, value); }
|
||||
}
|
||||
|
||||
private ErrorLoggerType errorLoggerType;
|
||||
public ErrorLoggerType ErrorLoggerType
|
||||
{
|
||||
get => errorLoggerType;
|
||||
set
|
||||
{
|
||||
Set(() => ErrorLoggerType, ref errorLoggerType, value);
|
||||
if(ReceiverType == ReceiverType.ErrorLogger)
|
||||
{
|
||||
if(errorLoggerType == ErrorLoggerType.BIT_64)
|
||||
{
|
||||
Address = "TsdcSystemSwErrorMailSlot64";
|
||||
}
|
||||
else
|
||||
{
|
||||
Address = "TsdcSystemSwErrorMailSlot";
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
private ReceiverType receiverType;
|
||||
public ReceiverType ReceiverType
|
||||
{
|
||||
get => receiverType;
|
||||
set
|
||||
{
|
||||
Set(() => ReceiverType, ref receiverType, value);
|
||||
IsAddressVisible = ReceiverType == ReceiverType.WCF || ReceiverType == ReceiverType.ErrorLogger;
|
||||
|
||||
if(ReceiverType == ReceiverType.WinDebug)
|
||||
{
|
||||
if(string.IsNullOrEmpty(Name))
|
||||
{
|
||||
Name = GetUniqueName("Windows Debug", 0);
|
||||
}
|
||||
Address = string.Empty;
|
||||
Port = 0;
|
||||
IsPortVisible = false;
|
||||
IsAddressVisible = false;
|
||||
IsErrorLogger = false;
|
||||
IsAutoSave = false;
|
||||
}
|
||||
else if(ReceiverType == ReceiverType.UDP)
|
||||
{
|
||||
if(string.IsNullOrEmpty(Name))
|
||||
{
|
||||
Name = GetUniqueName("UDP", 0);
|
||||
}
|
||||
Address = string.Empty;
|
||||
IsPortVisible = true;
|
||||
IsAddressVisible = false;
|
||||
IsErrorLogger = false;
|
||||
IsAutoSave = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
Port = 0;
|
||||
IsPortVisible = false;
|
||||
IsAddressVisible = true;
|
||||
IsErrorLogger = false;
|
||||
IsAutoSave = false;
|
||||
}
|
||||
|
||||
if(ReceiverType == ReceiverType.WCF)
|
||||
{
|
||||
if(string.IsNullOrEmpty(Name))
|
||||
{
|
||||
Name = GetUniqueName("EPTS", 0);
|
||||
}
|
||||
IsErrorLogger = false;
|
||||
Address = "net.pipe://localhost/EPServer";
|
||||
IsAutoSave = false;
|
||||
}
|
||||
|
||||
if(ReceiverType == ReceiverType.ErrorLogger)
|
||||
{
|
||||
if(string.IsNullOrEmpty(Name))
|
||||
{
|
||||
Name = GetUniqueName("Error Logger", 0);
|
||||
}
|
||||
IsErrorLogger = true;
|
||||
Address = "TsdcSystemSwErrorMailSlot";
|
||||
IsAutoSave = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// returns a unique suggestion for the receiver name
|
||||
/// </summary>
|
||||
/// <param name="baseName"></param>
|
||||
/// <param name="index"></param>
|
||||
/// <returns></returns>
|
||||
private string GetUniqueName(string baseName, int index)
|
||||
{
|
||||
if(receiverNames == null)
|
||||
{
|
||||
return baseName;
|
||||
}
|
||||
string rollingName = index > 1 ? $"{baseName} {index}" : baseName;
|
||||
while(receiverNames.ToList().Contains(rollingName))
|
||||
{
|
||||
return GetUniqueName(baseName, ++index);
|
||||
}
|
||||
return rollingName;
|
||||
}
|
||||
|
||||
private bool isPortVisible;
|
||||
public bool IsPortVisible
|
||||
{
|
||||
get => isPortVisible;
|
||||
set { Set(() => IsPortVisible, ref isPortVisible, value); }
|
||||
}
|
||||
private bool isErrorLogger;
|
||||
public bool IsErrorLogger
|
||||
{
|
||||
get => isErrorLogger;
|
||||
set { Set(() => IsErrorLogger, ref isErrorLogger, value); }
|
||||
}
|
||||
|
||||
public int Port
|
||||
{
|
||||
get => port;
|
||||
set { Set(() => Port, ref port, value); }
|
||||
}
|
||||
|
||||
[XmlIgnore]
|
||||
public SolidColorBrush Color
|
||||
{
|
||||
get => color;
|
||||
set
|
||||
{
|
||||
colorString = value.ToARGB();
|
||||
Set(() => Color, ref color, value);
|
||||
}
|
||||
}
|
||||
|
||||
public string ColorString
|
||||
{
|
||||
get => colorString;
|
||||
set
|
||||
{
|
||||
if(string.IsNullOrEmpty(value))
|
||||
{
|
||||
value = "#FFFFFFFF";
|
||||
}
|
||||
|
||||
color = color.FromARGB(value);
|
||||
Set(() => ColorString, ref colorString, value);
|
||||
}
|
||||
}
|
||||
|
||||
public bool IsActive
|
||||
{
|
||||
get => isActive;
|
||||
set { Set(() => IsActive, ref isActive, value); }
|
||||
}
|
||||
|
||||
public string Encoding
|
||||
{
|
||||
get => encoding;
|
||||
set { Set(() => Encoding, ref encoding, value); }
|
||||
}
|
||||
|
||||
private string address;
|
||||
public string Address
|
||||
{
|
||||
get => address;
|
||||
set { Set(() => Address, ref address, value); }
|
||||
}
|
||||
|
||||
private bool isAddressVisible;
|
||||
public bool IsAddressVisible
|
||||
{
|
||||
get => isAddressVisible;
|
||||
set { Set(() => IsAddressVisible, ref isAddressVisible, value); }
|
||||
}
|
||||
|
||||
private bool isAutoSave;
|
||||
public bool IsAutoSave
|
||||
{
|
||||
get => isAutoSave && Settings.Instance.IsAutoSave;
|
||||
set
|
||||
{
|
||||
Set(() => IsAutoSave, ref isAutoSave, value);
|
||||
|
||||
if(Parser != null)
|
||||
{
|
||||
Parser.IsAutoSave = isAutoSave;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[OnDeserialized]
|
||||
private void SetValuesOnDeserialized(StreamingContext context)
|
||||
{
|
||||
color = color.FromARGB(colorString);
|
||||
}
|
||||
|
||||
public object Clone()
|
||||
{
|
||||
return new Receiver(Name, Address, ReceiverType, receiverNames)
|
||||
{
|
||||
ColorString = ColorString,
|
||||
IsActive = IsActive,
|
||||
Color = Color,
|
||||
Port = Port,
|
||||
Encoding = Encoding,
|
||||
IsAddressVisible = IsAddressVisible,
|
||||
IsAutoSave = IsAutoSave,
|
||||
};
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// clear the parser
|
||||
/// </summary>
|
||||
public void Dispose()
|
||||
{
|
||||
Parser?.Dispose();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,94 @@
|
||||
//******************************************************************************//
|
||||
// ReceiverSetting.cs
|
||||
// 12/4/2023
|
||||
//
|
||||
// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
// PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
// AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
// UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
// RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
// CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
// OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
// COMPANY.
|
||||
//
|
||||
// THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
//
|
||||
// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
//
|
||||
// WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
// EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
// BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
// 120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
// 730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
// OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
// LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
// BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
// APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
// PENALTIES.
|
||||
//
|
||||
// DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
// FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
// INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
// DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
// RECONSTRUCTION OF THE DOCUMENT.
|
||||
// POC: Alex Kravchenko (1118268)
|
||||
//******************************************************************************//
|
||||
using System.Xml.Serialization;
|
||||
|
||||
namespace Raytheon.LogDashboard.Model
|
||||
{
|
||||
public class ReceiverSetting
|
||||
{
|
||||
public ReceiverSetting()
|
||||
{
|
||||
}
|
||||
|
||||
public ReceiverSetting(Receiver receiver)
|
||||
{
|
||||
Name = receiver.Name;
|
||||
IsHidden = receiver.IsHidden;
|
||||
ReceiverType = receiver.ReceiverType;
|
||||
IsPortVisible = receiver.IsPortVisible;
|
||||
Port = receiver.Port;
|
||||
IsAddressVisible = receiver.IsAddressVisible;
|
||||
Address = receiver.Address;
|
||||
IsActive = receiver.IsActive;
|
||||
Encoding = receiver.Encoding;
|
||||
ColorString = receiver.ColorString;
|
||||
IsAutoSave = receiver.IsAutoSave;
|
||||
}
|
||||
|
||||
[XmlElement]
|
||||
public bool IsHidden { get; set; }
|
||||
|
||||
[XmlElement]
|
||||
public string Name { get; set; }
|
||||
|
||||
[XmlElement]
|
||||
public ReceiverType ReceiverType { get; set; }
|
||||
|
||||
[XmlElement]
|
||||
public bool IsPortVisible { get; set; }
|
||||
|
||||
[XmlElement]
|
||||
public bool IsAutoSave { get; set; }
|
||||
|
||||
[XmlElement]
|
||||
public int Port { get; set; }
|
||||
|
||||
[XmlElement]
|
||||
public bool IsAddressVisible { get; set; }
|
||||
|
||||
[XmlElement]
|
||||
public string Address { get; set; }
|
||||
|
||||
[XmlElement]
|
||||
public bool IsActive { get; set; }
|
||||
|
||||
[XmlElement]
|
||||
public string Encoding { get; set; }
|
||||
|
||||
[XmlElement]
|
||||
public string ColorString { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
//******************************************************************************//
|
||||
// ReleaseNotes.cs
|
||||
// 12/4/2023
|
||||
//
|
||||
// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
// PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
// AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
// UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
// RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
// CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
// OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
// COMPANY.
|
||||
//
|
||||
// THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
//
|
||||
// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
//
|
||||
// WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
// EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
// BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
// 120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
// 730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
// OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
// LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
// BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
// APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
// PENALTIES.
|
||||
//
|
||||
// DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
// FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
// INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
// DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
// RECONSTRUCTION OF THE DOCUMENT.
|
||||
// POC: Alex Kravchenko (1118268)
|
||||
//******************************************************************************//
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Runtime.Serialization;
|
||||
using System.Xml.Serialization;
|
||||
|
||||
namespace Raytheon.LogDashboard.Model
|
||||
{
|
||||
[Serializable]
|
||||
[DataContract]
|
||||
public class ReleaseNotes
|
||||
{
|
||||
public string Version { get; set; }
|
||||
|
||||
public List<string> NewFeatures { get; set; } = new List<string>();
|
||||
|
||||
public List<string> ChangedFeatures { get; set; } = new List<string>();
|
||||
|
||||
public List<string> FixedBugs { get; set; } = new List<string>();
|
||||
|
||||
[XmlIgnore]
|
||||
public bool IsExpanded { get; set; } = false;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,250 @@
|
||||
//******************************************************************************//
|
||||
// Settings.cs
|
||||
// 12/4/2023
|
||||
//
|
||||
// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
// PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
// AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
// UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
// RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
// CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
// OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
// COMPANY.
|
||||
//
|
||||
// THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
//
|
||||
// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
//
|
||||
// WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
// EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
// BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
// 120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
// 730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
// OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
// LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
// BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
// APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
// PENALTIES.
|
||||
//
|
||||
// DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
// FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
// INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
// DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
// RECONSTRUCTION OF THE DOCUMENT.
|
||||
// POC: Alex Kravchenko (1118268)
|
||||
//******************************************************************************//
|
||||
|
||||
// Ignore Spelling: Taskbar
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Security.Permissions;
|
||||
using System.Web;
|
||||
using System.Windows.Media;
|
||||
using System.Windows;
|
||||
using NLog;
|
||||
using Raytheon.Common;
|
||||
using Raytheon.LogDashboard.ViewModel;
|
||||
using System.Linq;
|
||||
|
||||
namespace Raytheon.LogDashboard.Model
|
||||
{
|
||||
[Serializable]
|
||||
[PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
|
||||
[AspNetHostingPermission(SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
|
||||
public sealed class Settings
|
||||
{
|
||||
private static readonly Logger logger = LogManager.GetCurrentClassLogger();
|
||||
private static Settings instance;
|
||||
private readonly string settingsPath;
|
||||
private static LogDashViewModelLocator locatorInstance => (Application.Current.Resources["LogDashLocator"] as LogDashViewModelLocator);
|
||||
|
||||
public bool AutoStartInStartup { get; set; } = false;
|
||||
public bool MinimizeToTray { get; set; } = false;
|
||||
public bool OnlyOneAppInstance { get; set; } = false;
|
||||
public bool IsEnabledMaxMessageBufferSize { get; set; } = false;
|
||||
public int MaxMessageBufferSize { get; set; } = 1000000;
|
||||
public int DeletedMessagesCount { get; set; } = 100000;
|
||||
public string DataFormat { get; set; } = "MM/dd/yyyy HH:mm:ss.fff";
|
||||
public string FontColor { get; set; } = "#FFFFFFFF";
|
||||
|
||||
private static List<ColorTheme> BuildListOfThemes()
|
||||
{
|
||||
List<KeyValuePair<string, Color>> colors = typeof(Colors)
|
||||
.GetProperties()
|
||||
.Where(prop => typeof(Color).IsAssignableFrom(prop.PropertyType))
|
||||
.Select(prop => new KeyValuePair<string, Color>(prop.Name, (Color)prop.GetValue(null)))
|
||||
.ToList();
|
||||
|
||||
List<ColorTheme> themes = new List<ColorTheme>();
|
||||
|
||||
foreach(var color in colors)
|
||||
{
|
||||
themes.Add(new ColorTheme { Color = new SolidColorBrush(color.Value), Name = color.Key, ThemeColorString = color.Value.ToString() });
|
||||
}
|
||||
|
||||
return themes;
|
||||
}
|
||||
public static List<ColorTheme> ColorThemes { get; } = BuildListOfThemes();
|
||||
|
||||
public static List<string> Themes { get; } = new List<string> { "BaseLight", "BaseDark" };
|
||||
|
||||
public ColorTheme CurrentColorTheme { get; set; }
|
||||
|
||||
public string CurrentTheme { get; set; }
|
||||
|
||||
public List<Receiver> Receivers { get; set; } = new List<Receiver>();
|
||||
public List<IgnoredIPAddr> IgnoredIPs { get; set; } = new List<IgnoredIPAddr>();
|
||||
|
||||
/// <summary>
|
||||
/// show column with source
|
||||
/// </summary>
|
||||
public bool IsShowSourceColumn { get; set; } = false;
|
||||
|
||||
/// <summary>
|
||||
/// show thread column
|
||||
/// </summary>
|
||||
public bool IsShowThreadColumn { get; set; } = true;
|
||||
|
||||
/// <summary>
|
||||
/// show progress in the taskbar
|
||||
/// </summary>
|
||||
public bool IsShowTaskbarProgress { get; set; } = true;
|
||||
|
||||
/// <summary>
|
||||
/// highlight message with receiver color
|
||||
/// </summary>
|
||||
public bool ShowMessageHighlightByReceiverColor { get; set; } = false;
|
||||
|
||||
/// <summary>
|
||||
/// separate logs by port number
|
||||
/// </summary>
|
||||
public bool IsSeparateIPLoggersByPort { get; set; } = false;
|
||||
|
||||
public bool IsAutoSave { get; set; }
|
||||
|
||||
public bool IsErrorLogger { get; set; }
|
||||
|
||||
public string AutoSaveLocation { get; set; }
|
||||
|
||||
public long AutoSaveMaxSize { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// indicates if LogDashboard is embedded in another application
|
||||
/// </summary>
|
||||
public bool EmbeddedMode { get; set; }
|
||||
|
||||
private Settings(string path)
|
||||
{
|
||||
settingsPath = !string.IsNullOrEmpty(path)
|
||||
? path
|
||||
: Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "LogDashboard", "LogDashboard.xml");
|
||||
}
|
||||
|
||||
public static Settings Instance => instance ?? SetInstance("");
|
||||
|
||||
public static Settings SetInstance(string path) => instance ?? (instance = new Settings(path));
|
||||
|
||||
/// <summary>
|
||||
/// using theme
|
||||
/// </summary>
|
||||
public void ApplyTheme()
|
||||
{
|
||||
try
|
||||
{
|
||||
Application.Current.Resources.MergedDictionaries[2] = new ResourceDictionary { Source = CurrentColorTheme.ThemeUri };
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
logger.Warn(e, $"An error occurred while ApplyTheme. SelectedTheme - {CurrentColorTheme.Name}");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// save settings
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public bool Save()
|
||||
{
|
||||
try
|
||||
{
|
||||
ConfigurationFile configurationFile = new ConfigurationFile(settingsPath);
|
||||
|
||||
List<ReceiverSetting> receiverSettings = new List<ReceiverSetting>();
|
||||
foreach(Receiver receiver in Instance.Receivers)
|
||||
{
|
||||
receiverSettings.Add(new ReceiverSetting(receiver));
|
||||
}
|
||||
|
||||
configurationFile.WriteValue("Base", "AutoStartInStartup", Instance.AutoStartInStartup);
|
||||
configurationFile.WriteValue("Base", "MinimizeToTray", Instance.MinimizeToTray);
|
||||
configurationFile.WriteValue("CurrentThemes", "CurrentColorTheme", Instance.CurrentColorTheme);
|
||||
configurationFile.WriteValue("CurrentThemes", "CurrentTheme", Instance.CurrentTheme);
|
||||
configurationFile.WriteValue("Base", "DataFormat", Instance.DataFormat);
|
||||
configurationFile.WriteList("IgnoredIP", "IgnoredIP", Instance.IgnoredIPs);
|
||||
configurationFile.WriteList("ReceiverList", "Receiver", receiverSettings);
|
||||
configurationFile.WriteValue("Base", "FontColor", Instance.FontColor);
|
||||
configurationFile.WriteValue("Base", "OnlyOneAppInstance", Instance.OnlyOneAppInstance);
|
||||
configurationFile.WriteValue("Base", "IsEnabledMaxMessageBufferSize", Instance.IsEnabledMaxMessageBufferSize);
|
||||
configurationFile.WriteValue("Base", "MaxMessageBufferSize", Instance.MaxMessageBufferSize);
|
||||
configurationFile.WriteValue("Base", "DeletedMessagesCount", Instance.DeletedMessagesCount);
|
||||
configurationFile.WriteValue("Base", "IsShowSourceColumn", Instance.IsShowSourceColumn);
|
||||
configurationFile.WriteValue("Base", "IsShowThreadColumn", Instance.IsShowThreadColumn);
|
||||
configurationFile.WriteValue("Base", "IsShowTaskbarProgress", Instance.IsShowTaskbarProgress);
|
||||
configurationFile.WriteValue("Base", "ShowMessageHighlightByReceiverColor", Instance.ShowMessageHighlightByReceiverColor);
|
||||
configurationFile.WriteValue("Base", "IsSeparateIPLoggersByPort", Instance.IsSeparateIPLoggersByPort);
|
||||
configurationFile.WriteValue("Base", "EmbeddedMode", Instance.EmbeddedMode);
|
||||
configurationFile.WriteValue("Base", "IsAutoSave", Instance.IsAutoSave);
|
||||
configurationFile.WriteValue("Base", "IsErrorLogger", Instance.IsErrorLogger);
|
||||
configurationFile.WriteValue("Base", "AutoSaveLocation", Instance.AutoSaveLocation ?? "");
|
||||
|
||||
return true;
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
logger.Warn(e, "An error occurred while Save settings.");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public void Load()
|
||||
{
|
||||
IConfigurationFile configurationFile = new ConfigurationFile(settingsPath);
|
||||
Instance.AutoStartInStartup = configurationFile.ReadValue("Base", "AutoStartInStartup", true);
|
||||
Instance.MinimizeToTray = configurationFile.ReadValue("Base", "MinimizeToTray", false);
|
||||
|
||||
Instance.CurrentColorTheme = configurationFile.ReadValue("CurrentThemes", "CurrentColorTheme", new ColorTheme { Color = new SolidColorBrush(), Name = "DodgerBlue", ThemeColorString = "#FF1E90FF" });
|
||||
|
||||
Instance.CurrentTheme = configurationFile.ReadValue("CurrentThemes", "CurrentTheme", "BaseLight");
|
||||
|
||||
Instance.DataFormat = configurationFile.ReadValue("Base", "DataFormat", "MM/dd/yyyy HH:mm:ss.fff");
|
||||
Instance.IgnoredIPs = configurationFile.ReadList("IgnoredIP", "IgnoredIP", new List<IgnoredIPAddr>());
|
||||
var receiverSettins = configurationFile.ReadList("ReceiverList", "Receiver", new List<ReceiverSetting>
|
||||
{
|
||||
new ReceiverSetting { Name = "UDP", ReceiverType = ReceiverType.UDP, Port = 7777, IsActive = true, ColorString = "#00FFFFFF", IsPortVisible = true, Encoding = "UTF-8" }
|
||||
});
|
||||
|
||||
foreach(ReceiverSetting receiverSetting in receiverSettins)
|
||||
{
|
||||
Instance.Receivers.Add(new Receiver(receiverSetting));
|
||||
}
|
||||
|
||||
Instance.FontColor = configurationFile.ReadValue("Base", "FontColor", "#FF1E90FF");
|
||||
Instance.OnlyOneAppInstance = configurationFile.ReadValue("Base", "OnlyOneAppInstance", true);
|
||||
Instance.IsEnabledMaxMessageBufferSize = configurationFile.ReadValue("Base", "IsEnabledMaxMessageBufferSize", false);
|
||||
Instance.MaxMessageBufferSize = configurationFile.ReadValue("Base", "MaxMessageBufferSize", 1000000);
|
||||
Instance.DeletedMessagesCount = configurationFile.ReadValue("Base", "DeletedMessagesCount", 100000);
|
||||
Instance.IsShowSourceColumn = configurationFile.ReadValue("Base", "IsShowSourceColumn", true);
|
||||
Instance.IsShowThreadColumn = configurationFile.ReadValue("Base", "IsShowThreadColumn", true);
|
||||
Instance.IsShowTaskbarProgress = configurationFile.ReadValue("Base", "IsShowTaskbarProgress", true);
|
||||
Instance.ShowMessageHighlightByReceiverColor = configurationFile.ReadValue("Base", "ShowMessageHighlightByReceiverColor", true);
|
||||
Instance.IsSeparateIPLoggersByPort = configurationFile.ReadValue("Base", "IsSeparateIPLoggersByPort", true);
|
||||
Instance.EmbeddedMode = configurationFile.ReadValue("Base", "EmbeddedMode", false);
|
||||
Instance.IsAutoSave = configurationFile.ReadValue("Base", "IsAutoSave", false);
|
||||
Instance.IsErrorLogger = configurationFile.ReadValue("Base", "IsErrorLogger", false);
|
||||
Instance.AutoSaveLocation = configurationFile.ReadValue("Base", "AutoSaveLocation", "");
|
||||
Instance.AutoSaveMaxSize = configurationFile.ReadValue<long>("Base", "AutoSaveMaxSize", 10 * 1048576); // 10 MG
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,83 @@
|
||||
//******************************************************************************//
|
||||
// Theme.cs
|
||||
// 12/4/2023
|
||||
//
|
||||
// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
// PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
// AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
// UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
// RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
// CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
// OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
// COMPANY.
|
||||
//
|
||||
// THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
//
|
||||
// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
//
|
||||
// WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
// EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
// BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
// 120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
// 730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
// OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
// LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
// BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
// APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
// PENALTIES.
|
||||
//
|
||||
// DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
// FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
// INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
// DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
// RECONSTRUCTION OF THE DOCUMENT.
|
||||
// POC: Alex Kravchenko (1118268)
|
||||
//******************************************************************************//
|
||||
using Raytheon.LogDashboard.Helpers;
|
||||
using System;
|
||||
using System.Runtime.Serialization;
|
||||
using System.Windows.Media;
|
||||
using System.Xml.Serialization;
|
||||
|
||||
namespace Raytheon.LogDashboard.Model
|
||||
{
|
||||
public class ColorTheme
|
||||
{
|
||||
[NonSerialized]
|
||||
private SolidColorBrush themeColor = (SolidColorBrush)new BrushConverter().ConvertFrom("#3F51B5");
|
||||
|
||||
[DataMember(Name = "ThemeColorString")]
|
||||
private string themeColorString;
|
||||
|
||||
public string Name { get; set; }
|
||||
|
||||
[XmlIgnore]
|
||||
public SolidColorBrush Color
|
||||
{
|
||||
get => themeColor;
|
||||
set
|
||||
{
|
||||
themeColor = value;
|
||||
themeColorString = themeColor.ToARGB();
|
||||
}
|
||||
}
|
||||
|
||||
[XmlIgnore]
|
||||
public Uri ThemeUri => new Uri($"pack://application:,,,/MahApps.Metro;component/Styles/Themes/{Name}.xaml");
|
||||
public string ThemeColorString
|
||||
{
|
||||
get => themeColorString;
|
||||
set
|
||||
{
|
||||
themeColorString = value;
|
||||
themeColor = themeColor.FromARGB(themeColorString);
|
||||
}
|
||||
}
|
||||
|
||||
[OnDeserialized]
|
||||
private void SetValuesOnDeserialized(StreamingContext context)
|
||||
{
|
||||
themeColor = themeColor.FromARGB(themeColorString);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,428 @@
|
||||
//******************************************************************************//
|
||||
// DebugMonitor.cs
|
||||
// 12/4/2023
|
||||
//
|
||||
// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
// PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
// AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
// UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
// RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
// CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
// OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
// COMPANY.
|
||||
//
|
||||
// THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
//
|
||||
// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
//
|
||||
// WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
// EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
// BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
// 120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
// 730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
// OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
// LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
// BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
// APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
// PENALTIES.
|
||||
//
|
||||
// DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
// FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
// INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
// DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
// RECONSTRUCTION OF THE DOCUMENT.
|
||||
// POC: Alex Kravchenko (1118268)
|
||||
//******************************************************************************//
|
||||
using System;
|
||||
using System.Threading;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace Raytheon.LogDashboard.Parsers
|
||||
{
|
||||
/// <summary>
|
||||
/// Delegate used when firing DebugMonitor.OnOutputDebug event
|
||||
/// </summary>
|
||||
public delegate void OnOutputDebugStringHandler(int pid, string text);
|
||||
|
||||
/// <summary>
|
||||
/// This class captures all strings passed to <c>OutputDebugString</c> when
|
||||
/// the application is not debugged.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// This class is a port of Microsoft's Visual Studio's C++ example "dbmon", which
|
||||
/// can be found at <c>http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vcsample98/html/vcsmpdbmon.asp</c>.
|
||||
/// </remarks>
|
||||
/// <remarks>
|
||||
/// <code>
|
||||
/// public static void Main(string[] args) {
|
||||
/// DebugMonitor.Start();
|
||||
/// DebugMonitor.OnOutputDebugString += new OnOutputDebugStringHandler(OnOutputDebugString);
|
||||
/// Console.WriteLine("Press 'Enter' to exit.");
|
||||
/// Console.ReadLine();
|
||||
/// DebugMonitor.Stop();
|
||||
/// }
|
||||
///
|
||||
/// private static void OnOutputDebugString(int pid, string text) {
|
||||
/// Console.WriteLine(DateTime.Now + ": " + text);
|
||||
/// }
|
||||
/// </code>
|
||||
/// </remarks>
|
||||
public static class DebugMonitor
|
||||
{
|
||||
#region Win32 API Imports
|
||||
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
private struct SECURITY_DESCRIPTOR
|
||||
{
|
||||
public byte revision;
|
||||
public byte size;
|
||||
public short control;
|
||||
public IntPtr owner;
|
||||
public IntPtr group;
|
||||
public IntPtr sacl;
|
||||
public IntPtr dacl;
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
private struct SECURITY_ATTRIBUTES
|
||||
{
|
||||
public int nLength;
|
||||
public IntPtr lpSecurityDescriptor;
|
||||
public int bInheritHandle;
|
||||
}
|
||||
|
||||
[Flags]
|
||||
private enum PageProtection : uint
|
||||
{
|
||||
NoAccess = 0x01,
|
||||
Readonly = 0x02,
|
||||
ReadWrite = 0x04,
|
||||
WriteCopy = 0x08,
|
||||
Execute = 0x10,
|
||||
ExecuteRead = 0x20,
|
||||
ExecuteReadWrite = 0x40,
|
||||
ExecuteWriteCopy = 0x80,
|
||||
Guard = 0x100,
|
||||
NoCache = 0x200,
|
||||
WriteCombine = 0x400,
|
||||
}
|
||||
|
||||
|
||||
private const int WAIT_OBJECT_0 = 0;
|
||||
private const uint INFINITE = 0xFFFFFFFF;
|
||||
private const int ERROR_ALREADY_EXISTS = 183;
|
||||
|
||||
private const uint SECURITY_DESCRIPTOR_REVISION = 1;
|
||||
|
||||
private const uint SECTION_MAP_READ = 0x0004;
|
||||
|
||||
[DllImport("kernel32.dll", SetLastError = true)]
|
||||
private static extern IntPtr MapViewOfFile(IntPtr hFileMappingObject, uint
|
||||
dwDesiredAccess, uint dwFileOffsetHigh, uint dwFileOffsetLow,
|
||||
uint dwNumberOfBytesToMap);
|
||||
|
||||
[DllImport("kernel32.dll", SetLastError = true)]
|
||||
private static extern bool UnmapViewOfFile(IntPtr lpBaseAddress);
|
||||
|
||||
[DllImport("advapi32.dll", SetLastError = true)]
|
||||
private static extern bool InitializeSecurityDescriptor(ref SECURITY_DESCRIPTOR sd, uint dwRevision);
|
||||
|
||||
[DllImport("advapi32.dll", SetLastError = true)]
|
||||
private static extern bool SetSecurityDescriptorDacl(ref SECURITY_DESCRIPTOR sd, bool daclPresent, IntPtr dacl, bool daclDefaulted);
|
||||
|
||||
[DllImport("kernel32.dll")]
|
||||
private static extern IntPtr CreateEvent(ref SECURITY_ATTRIBUTES sa, bool bManualReset, bool bInitialState, string lpName);
|
||||
|
||||
[DllImport("kernel32.dll")]
|
||||
private static extern bool PulseEvent(IntPtr hEvent);
|
||||
|
||||
[DllImport("kernel32.dll")]
|
||||
private static extern bool SetEvent(IntPtr hEvent);
|
||||
|
||||
[DllImport("kernel32.dll", SetLastError = true)]
|
||||
private static extern IntPtr CreateFileMapping(IntPtr hFile,
|
||||
ref SECURITY_ATTRIBUTES lpFileMappingAttributes, PageProtection flProtect, uint dwMaximumSizeHigh,
|
||||
uint dwMaximumSizeLow, string lpName);
|
||||
|
||||
[DllImport("kernel32.dll", SetLastError = true)]
|
||||
private static extern bool CloseHandle(IntPtr hHandle);
|
||||
|
||||
[DllImport("kernel32", SetLastError = true, ExactSpelling = true)]
|
||||
private static extern Int32 WaitForSingleObject(IntPtr handle, uint milliseconds);
|
||||
#endregion
|
||||
|
||||
/// <summary>
|
||||
/// Fired if an application calls <c>OutputDebugString</c>
|
||||
/// </summary>
|
||||
public static event OnOutputDebugStringHandler OnOutputDebugString;
|
||||
|
||||
/// <summary>
|
||||
/// Event handle for slot 'DBWIN_BUFFER_READY'
|
||||
/// </summary>
|
||||
private static IntPtr m_AckEvent = IntPtr.Zero;
|
||||
|
||||
/// <summary>
|
||||
/// Event handle for slot 'DBWIN_DATA_READY'
|
||||
/// </summary>
|
||||
private static IntPtr m_ReadyEvent = IntPtr.Zero;
|
||||
|
||||
/// <summary>
|
||||
/// Handle for our shared file
|
||||
/// </summary>
|
||||
private static IntPtr m_SharedFile = IntPtr.Zero;
|
||||
|
||||
/// <summary>
|
||||
/// Handle for our shared memory
|
||||
/// </summary>
|
||||
private static IntPtr m_SharedMem = IntPtr.Zero;
|
||||
|
||||
/// <summary>
|
||||
/// Our capturing thread
|
||||
/// </summary>
|
||||
private static Thread m_Capturer = null;
|
||||
|
||||
/// <summary>
|
||||
/// Our synchronization root
|
||||
/// </summary>
|
||||
private static object m_SyncRoot = new object();
|
||||
|
||||
/// <summary>
|
||||
/// Mutex for singleton check
|
||||
/// </summary>
|
||||
private static Mutex m_Mutex = null;
|
||||
|
||||
/// <summary>
|
||||
/// Starts this debug monitor
|
||||
/// </summary>
|
||||
public static void Start()
|
||||
{
|
||||
lock(m_SyncRoot)
|
||||
{
|
||||
if(m_Capturer != null)
|
||||
{
|
||||
throw new ApplicationException("This DebugMonitor is already started.");
|
||||
}
|
||||
|
||||
// Check for supported operating system. Mono (at least with *nix) won't support
|
||||
// our P/Invoke calls.
|
||||
if(Environment.OSVersion.ToString().IndexOf("Microsoft") == -1)
|
||||
{
|
||||
throw new NotSupportedException("This DebugMonitor is only supported on Microsoft operating systems.");
|
||||
}
|
||||
|
||||
// Check for multiple instances. As the README.TXT of the msdn
|
||||
// example notes it is possible to have multiple debug monitors
|
||||
// listen on OutputDebugString, but the message will be randomly
|
||||
// distributed among all running instances so this won't be
|
||||
// such a good idea.
|
||||
m_Mutex = new Mutex(false, typeof(DebugMonitor).Namespace, out bool createdNew);
|
||||
if(!createdNew)
|
||||
{
|
||||
throw new ApplicationException("There is already an instance of 'DbMon.NET' running.");
|
||||
}
|
||||
|
||||
SECURITY_DESCRIPTOR sd = new SECURITY_DESCRIPTOR();
|
||||
|
||||
// Initialize the security descriptor.
|
||||
if(!InitializeSecurityDescriptor(ref sd, SECURITY_DESCRIPTOR_REVISION))
|
||||
{
|
||||
throw CreateApplicationException("Failed to initializes the security descriptor.");
|
||||
}
|
||||
|
||||
// Set information in a discretionary access control list
|
||||
if(!SetSecurityDescriptorDacl(ref sd, true, IntPtr.Zero, false))
|
||||
{
|
||||
throw CreateApplicationException("Failed to initializes the security descriptor");
|
||||
}
|
||||
|
||||
SECURITY_ATTRIBUTES sa = new SECURITY_ATTRIBUTES();
|
||||
|
||||
// Create the event for slot 'DBWIN_BUFFER_READY'
|
||||
m_AckEvent = CreateEvent(ref sa, false, false, "DBWIN_BUFFER_READY");
|
||||
if(m_AckEvent == IntPtr.Zero)
|
||||
{
|
||||
throw CreateApplicationException("Failed to create event 'DBWIN_BUFFER_READY'");
|
||||
}
|
||||
|
||||
// Create the event for slot 'DBWIN_DATA_READY'
|
||||
m_ReadyEvent = CreateEvent(ref sa, false, false, "DBWIN_DATA_READY");
|
||||
if(m_ReadyEvent == IntPtr.Zero)
|
||||
{
|
||||
throw CreateApplicationException("Failed to create event 'DBWIN_DATA_READY'");
|
||||
}
|
||||
|
||||
// Get a handle to the readable shared memory at slot 'DBWIN_BUFFER'.
|
||||
m_SharedFile = CreateFileMapping(new IntPtr(-1), ref sa, PageProtection.ReadWrite, 0, 4096, "DBWIN_BUFFER");
|
||||
if(m_SharedFile == IntPtr.Zero)
|
||||
{
|
||||
throw CreateApplicationException("Failed to create a file mapping to slot 'DBWIN_BUFFER'");
|
||||
}
|
||||
|
||||
// Create a view for this file mapping so we can access it
|
||||
m_SharedMem = MapViewOfFile(m_SharedFile, SECTION_MAP_READ, 0, 0, 512);
|
||||
if(m_SharedMem == IntPtr.Zero)
|
||||
{
|
||||
throw CreateApplicationException("Failed to create a mapping view for slot 'DBWIN_BUFFER'");
|
||||
}
|
||||
|
||||
// Start a new thread where we can capture the output
|
||||
// of OutputDebugString calls so we don't block here.
|
||||
m_Capturer = new Thread(new ThreadStart(Capture));
|
||||
m_Capturer.Start();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Captures
|
||||
/// </summary>
|
||||
private static void Capture()
|
||||
{
|
||||
try
|
||||
{
|
||||
// Everything after the first DWORD is our debugging text
|
||||
IntPtr pString = new IntPtr(m_SharedMem.ToInt64() + Marshal.SizeOf(typeof(long)));
|
||||
|
||||
while(true)
|
||||
{
|
||||
SetEvent(m_AckEvent);
|
||||
|
||||
int ret = WaitForSingleObject(m_ReadyEvent, INFINITE);
|
||||
|
||||
// if we have no capture set it means that someone
|
||||
// called 'Stop()' and is now waiting for us to exit
|
||||
// this endless loop.
|
||||
if(m_Capturer == null)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
if(ret == WAIT_OBJECT_0)
|
||||
{
|
||||
// The first DWORD of the shared memory buffer contains
|
||||
// the process ID of the client that sent the debug string.
|
||||
FireOnOutputDebugString(Marshal.ReadInt32(m_SharedMem), Marshal.PtrToStringAnsi(pString));
|
||||
}
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
throw;
|
||||
// Cleanup
|
||||
}
|
||||
finally
|
||||
{
|
||||
Dispose();
|
||||
}
|
||||
}
|
||||
|
||||
private static void FireOnOutputDebugString(int pid, string text)
|
||||
{
|
||||
// Raise event if we have any listeners
|
||||
if(OnOutputDebugString == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
#if !DEBUG
|
||||
try {
|
||||
#endif
|
||||
OnOutputDebugString(pid, text);
|
||||
#if !DEBUG
|
||||
} catch (Exception ex) {
|
||||
Console.WriteLine("An 'OnOutputDebugString' handler failed to execute: " + ex.ToString());
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Dispose all resources
|
||||
/// </summary>
|
||||
private static void Dispose()
|
||||
{
|
||||
// Close AckEvent
|
||||
if(m_AckEvent != IntPtr.Zero)
|
||||
{
|
||||
if(!CloseHandle(m_AckEvent))
|
||||
{
|
||||
throw CreateApplicationException("Failed to close handle for 'AckEvent'");
|
||||
}
|
||||
m_AckEvent = IntPtr.Zero;
|
||||
}
|
||||
|
||||
// Close ReadyEvent
|
||||
if(m_ReadyEvent != IntPtr.Zero)
|
||||
{
|
||||
if(!CloseHandle(m_ReadyEvent))
|
||||
{
|
||||
throw CreateApplicationException("Failed to close handle for 'ReadyEvent'");
|
||||
}
|
||||
m_ReadyEvent = IntPtr.Zero;
|
||||
}
|
||||
|
||||
// Close SharedFile
|
||||
if(m_SharedFile != IntPtr.Zero)
|
||||
{
|
||||
if(!CloseHandle(m_SharedFile))
|
||||
{
|
||||
throw CreateApplicationException("Failed to close handle for 'SharedFile'");
|
||||
}
|
||||
m_SharedFile = IntPtr.Zero;
|
||||
}
|
||||
|
||||
|
||||
// Unmap SharedMem
|
||||
if(m_SharedMem != IntPtr.Zero)
|
||||
{
|
||||
if(!UnmapViewOfFile(m_SharedMem))
|
||||
{
|
||||
throw CreateApplicationException("Failed to unmap view for slot 'DBWIN_BUFFER'");
|
||||
}
|
||||
m_SharedMem = IntPtr.Zero;
|
||||
}
|
||||
|
||||
// Close our mutex
|
||||
if(m_Mutex != null)
|
||||
{
|
||||
m_Mutex.Close();
|
||||
m_Mutex = null;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Stops this debug monitor. This call we block the executing thread
|
||||
/// until this debug monitor is stopped.
|
||||
/// </summary>
|
||||
public static void Stop()
|
||||
{
|
||||
lock(m_SyncRoot)
|
||||
{
|
||||
if(m_Capturer == null)
|
||||
{
|
||||
throw new ObjectDisposedException("DebugMonitor", "This DebugMonitor is not running.");
|
||||
}
|
||||
m_Capturer = null;
|
||||
|
||||
PulseEvent(m_ReadyEvent);
|
||||
while(m_AckEvent != IntPtr.Zero)
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Helper to create a new application exception, which has automatically the
|
||||
/// last win 32 error code appended.
|
||||
/// </summary>
|
||||
/// <param name="text">text</param>
|
||||
private static ApplicationException CreateApplicationException(string text)
|
||||
{
|
||||
if(text == null || text.Length < 1)
|
||||
{
|
||||
throw new ArgumentNullException("text", "'text' may not be empty or null.");
|
||||
}
|
||||
|
||||
return new ApplicationException(string.Format("{0}. Last Win32 Error was {1}", text, Marshal.GetLastWin32Error()));
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,140 @@
|
||||
//******************************************************************************//
|
||||
// DebugMonitorParser.cs
|
||||
// 12/4/2023
|
||||
//
|
||||
// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
// PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
// AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
// UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
// RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
// CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
// OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
// COMPANY.
|
||||
//
|
||||
// THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
//
|
||||
// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
//
|
||||
// WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
// EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
// BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
// 120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
// 730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
// OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
// LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
// BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
// APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
// PENALTIES.
|
||||
//
|
||||
// DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
// FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
// INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
// DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
// RECONSTRUCTION OF THE DOCUMENT.
|
||||
// POC: Alex Kravchenko (1118268)
|
||||
//******************************************************************************//
|
||||
using GalaSoft.MvvmLight.Messaging;
|
||||
using Raytheon.LogDashboard.Model;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Net.Sockets;
|
||||
|
||||
namespace Raytheon.LogDashboard.Parsers
|
||||
{
|
||||
public class DebugMonitorParser : PacketsParser
|
||||
{
|
||||
private readonly Queue<LogMessage> _messages = new Queue<LogMessage>();
|
||||
|
||||
public DebugMonitorParser(string name, bool isAutoSave)
|
||||
: base(name, isAutoSave)
|
||||
{
|
||||
}
|
||||
|
||||
public DebugMonitorParser(string name, string address, bool isAutoSave)
|
||||
: this(name, isAutoSave)
|
||||
{
|
||||
Address = address;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// initialize WinDebug parser
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public override bool Init()
|
||||
{
|
||||
try
|
||||
{
|
||||
base.Init();
|
||||
|
||||
DebugMonitor.OnOutputDebugString += DebugMonitor_OnOutputDebugString;
|
||||
DebugMonitor.Start();
|
||||
|
||||
IsInitialized = true;
|
||||
return IsInitialized;
|
||||
}
|
||||
catch(SocketException socketException)
|
||||
{
|
||||
Logger.Warn(socketException, "An error occurred in DebugMonitorParser initializer.");
|
||||
IsInitialized = false;
|
||||
return IsInitialized;
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
Logger.Warn(e, "An error occurred in DebugMonitorParser initializer.");
|
||||
IsInitialized = false;
|
||||
return IsInitialized;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// gets single message
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public override LogMessage GetLog()
|
||||
{
|
||||
var log = _messages.Count > 0 ? _messages.Dequeue() : null;
|
||||
|
||||
if(IsAutoSave && log != null)
|
||||
{
|
||||
Messenger.Default.Send(log, "PersistLogMessage");
|
||||
}
|
||||
|
||||
return log;
|
||||
}
|
||||
|
||||
private void DebugMonitor_OnOutputDebugString(int pid, string text)
|
||||
{
|
||||
DashboardLogLevel level;
|
||||
if(text.IndexOf("error", StringComparison.OrdinalIgnoreCase) >= 0)
|
||||
{
|
||||
level = DashboardLogLevel.Error;
|
||||
}
|
||||
else if(text.IndexOf("warning", StringComparison.OrdinalIgnoreCase) >= 0)
|
||||
{
|
||||
level = DashboardLogLevel.Warn;
|
||||
}
|
||||
else
|
||||
{
|
||||
level = DashboardLogLevel.Debug;
|
||||
}
|
||||
|
||||
_messages.Enqueue(new LogMessage
|
||||
{
|
||||
ProcessID = pid,
|
||||
Thread = pid,
|
||||
Logger = Name,
|
||||
Address = Environment.MachineName,
|
||||
Message = text,
|
||||
Level = level,
|
||||
Time = DateTime.Now
|
||||
});
|
||||
}
|
||||
|
||||
public override void Dispose()
|
||||
{
|
||||
base.Dispose();
|
||||
|
||||
DebugMonitor.Stop();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,209 @@
|
||||
//******************************************************************************//
|
||||
// ErrorLoggerPacketsParser.cs
|
||||
// 12/4/2023
|
||||
//
|
||||
// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
// PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
// AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
// UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
// RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
// CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
// OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
// COMPANY.
|
||||
//
|
||||
// THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
//
|
||||
// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
//
|
||||
// WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
// EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
// BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
// 120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
// 730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
// OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
// LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
// BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
// APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
// PENALTIES.
|
||||
//
|
||||
// DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
// FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
// INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
// DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
// RECONSTRUCTION OF THE DOCUMENT.
|
||||
// POC: Alex Kravchenko (1118268)
|
||||
//******************************************************************************//
|
||||
using GalaSoft.MvvmLight.Messaging;
|
||||
using Raytheon.LogDashboard.Model;
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
|
||||
namespace Raytheon.LogDashboard.Parsers
|
||||
{
|
||||
/// <summary>
|
||||
/// \\\\.\\mailslot\\TsdcSystemSwErrorMailSlot
|
||||
/// \\\\.\\mailslot\\TsdcSystemSwErrorMailSlot64
|
||||
/// </summary>
|
||||
public class ErrorLoggerPacketsParser : PacketsParser
|
||||
{
|
||||
private MailslotServer mailslotServer { get; set; }
|
||||
private Mutex _mutex;
|
||||
|
||||
public ErrorLoggerPacketsParser(string name, bool isAutoSave)
|
||||
: base(name, isAutoSave)
|
||||
{ }
|
||||
|
||||
public ErrorLoggerPacketsParser(string name, string address, bool isAutoSave)
|
||||
: this(name, isAutoSave)
|
||||
{
|
||||
Address = address;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public override LogMessage GetLog()
|
||||
{
|
||||
string msg = mailslotServer.GetNextMessage();
|
||||
|
||||
if(msg != null)
|
||||
{
|
||||
return ParseString(msg);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private LogMessage ParseString(string inputString)
|
||||
{
|
||||
int index = 0;
|
||||
string[] fields = new string[4];
|
||||
for(int i = 0; i < 3; i++)
|
||||
{
|
||||
int nextIndex = inputString.IndexOf(',', index);
|
||||
if(nextIndex == -1)
|
||||
{
|
||||
throw new ArgumentException("Input string is not in the correct format.");
|
||||
}
|
||||
fields[i] = inputString.Substring(index, nextIndex - index).Trim();
|
||||
index = nextIndex + 1;
|
||||
}
|
||||
fields[3] = inputString.Substring(index).Trim();
|
||||
|
||||
LogMessage msg = new LogMessage
|
||||
{
|
||||
Logger = Name,
|
||||
Address = Address,
|
||||
Time = ParseDate(fields[1]),
|
||||
Level = GetLevel(fields[2]),
|
||||
Message = fields[3]
|
||||
};
|
||||
|
||||
if(IsAutoSave && msg != null)
|
||||
{
|
||||
Messenger.Default.Send(msg, "PersistLogMessage");
|
||||
}
|
||||
|
||||
return msg;
|
||||
}
|
||||
|
||||
private DateTime ParseDate(string data)
|
||||
{
|
||||
if(DateTime.TryParseExact(data, "ddd MMM dd HH:mm:ss yyyy fff'ms'", null, DateTimeStyles.AssumeLocal, out DateTime dateTime))
|
||||
{
|
||||
return dateTime;
|
||||
}
|
||||
else
|
||||
{
|
||||
return DateTime.Now;
|
||||
}
|
||||
}
|
||||
|
||||
private DashboardLogLevel GetLevel(string level)
|
||||
{
|
||||
switch(level)
|
||||
{
|
||||
case "LOG_INFO_VERBOSE":
|
||||
return DashboardLogLevel.Trace;
|
||||
case "LOG_INFORMATION":
|
||||
return DashboardLogLevel.Info;
|
||||
case "LOG_WARNING":
|
||||
return DashboardLogLevel.Warn;
|
||||
case "LOG_DEBUG":
|
||||
return DashboardLogLevel.Debug;
|
||||
case "LOG_ERROR":
|
||||
return DashboardLogLevel.Error;
|
||||
|
||||
default:
|
||||
return DashboardLogLevel.Error;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public override bool Init()
|
||||
{
|
||||
base.Init();
|
||||
|
||||
string strMutex = !string.IsNullOrEmpty(Address) && Address.Trim().EndsWith("64") ?
|
||||
"ErrorLoggerMutex_F1BB29A5-0AFC-45e9-A725-C302DF7EB3CF_64" :
|
||||
"ErrorLoggerMutex_F1BB29A5-0AFC-45e9-A725-C302DF7EB3CF";
|
||||
|
||||
_mutex = new Mutex(true, strMutex, out bool createdNew);
|
||||
|
||||
if(!createdNew)
|
||||
{
|
||||
Process[] errorLoggerProcesses = Process.GetProcessesByName("ErrorLogger");
|
||||
if(errorLoggerProcesses.Any())
|
||||
{
|
||||
Process er = errorLoggerProcesses.First();
|
||||
|
||||
Messenger.Default.Send("Detected ErrorLogger instance running. Please close ErrorLogger or disable the Error Logger receiver.", "DisplayCustomMessage");
|
||||
|
||||
_mutex = new Mutex(true, strMutex, out createdNew);
|
||||
}
|
||||
}
|
||||
|
||||
if(!createdNew)
|
||||
{
|
||||
Logger.Error($"Error initializing Mailslot {Address}\nOnly one instance of ErrorLogger is allowed");
|
||||
|
||||
IsInitialized = false;
|
||||
return false;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
mailslotServer = new MailslotServer(Address);
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
Logger.Error($"Error initializing Mailslot {Address}\n{ex.Message}");
|
||||
|
||||
IsInitialized = false;
|
||||
return false;
|
||||
}
|
||||
|
||||
IsInitialized = true;
|
||||
return IsInitialized;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public override void Dispose()
|
||||
{
|
||||
base.Dispose();
|
||||
|
||||
mailslotServer?.Dispose();
|
||||
|
||||
_mutex?.Dispose();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,148 @@
|
||||
//******************************************************************************//
|
||||
// Mailslot.cs
|
||||
// 12/4/2023
|
||||
//
|
||||
// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
// PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
// AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
// UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
// RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
// CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
// OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
// COMPANY.
|
||||
//
|
||||
// THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
//
|
||||
// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
//
|
||||
// WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
// EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
// BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
// 120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
// 730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
// OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
// LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
// BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
// APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
// PENALTIES.
|
||||
//
|
||||
// DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
// FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
// INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
// DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
// RECONSTRUCTION OF THE DOCUMENT.
|
||||
// POC: Alex Kravchenko (1118268)
|
||||
//******************************************************************************//
|
||||
using Microsoft.Win32.SafeHandles;
|
||||
using System;
|
||||
using System.ComponentModel;
|
||||
using System.Runtime.ConstrainedExecution;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Security.Permissions;
|
||||
using System.Security;
|
||||
using System.Text;
|
||||
|
||||
namespace Raytheon.LogDashboard.Parsers
|
||||
{
|
||||
[SuppressUnmanagedCodeSecurity]
|
||||
public static class Mailslot
|
||||
{
|
||||
public const int MailslotNoMessage = -1;
|
||||
|
||||
[HostProtection(SecurityAction.LinkDemand, MayLeakOnAbort = true)]
|
||||
[SecurityPermission(SecurityAction.LinkDemand, UnmanagedCode = true)]
|
||||
public sealed class SafeMailslotHandle : SafeHandleZeroOrMinusOneIsInvalid
|
||||
{
|
||||
private SafeMailslotHandle()
|
||||
: base(true)
|
||||
{ }
|
||||
|
||||
public SafeMailslotHandle(IntPtr preexistingHandle, bool ownsHandle)
|
||||
: base(ownsHandle)
|
||||
{
|
||||
SetHandle(preexistingHandle);
|
||||
}
|
||||
|
||||
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
|
||||
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
|
||||
[return: MarshalAs(UnmanagedType.Bool)]
|
||||
private static extern bool CloseHandle(IntPtr handle);
|
||||
|
||||
protected override bool ReleaseHandle()
|
||||
{
|
||||
return CloseHandle(base.handle);
|
||||
}
|
||||
}
|
||||
|
||||
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
|
||||
public static extern SafeMailslotHandle CreateMailslot(string mailslotName,
|
||||
uint nMaxMessageSize, int lReadTimeout,
|
||||
IntPtr securityAttributes);
|
||||
|
||||
|
||||
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
|
||||
[return: MarshalAs(UnmanagedType.Bool)]
|
||||
public static extern bool GetMailslotInfo(SafeMailslotHandle hMailslot,
|
||||
IntPtr lpMaxMessageSize,
|
||||
out int lpNextSize, out int lpMessageCount,
|
||||
IntPtr lpReadTimeout);
|
||||
|
||||
|
||||
[DllImport("kernel32.dll", CharSet = CharSet.Ansi, SetLastError = true)]
|
||||
[return: MarshalAs(UnmanagedType.Bool)]
|
||||
public static extern bool ReadFile(SafeMailslotHandle handle,
|
||||
byte[] bytes, int numBytesToRead,
|
||||
out int numBytesRead,
|
||||
IntPtr overlapped);
|
||||
}
|
||||
|
||||
public class MailslotServer : IDisposable
|
||||
{
|
||||
private Mailslot.SafeMailslotHandle _handle;
|
||||
|
||||
public MailslotServer(string name)
|
||||
{
|
||||
_handle = Mailslot.CreateMailslot(@"\\.\mailslot\" + name, 0, 0, IntPtr.Zero);
|
||||
if(_handle.IsInvalid)
|
||||
{
|
||||
throw new Win32Exception();
|
||||
}
|
||||
}
|
||||
|
||||
public string GetNextMessage()
|
||||
{
|
||||
if(_handle == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
if(!Mailslot.GetMailslotInfo(_handle, IntPtr.Zero, out int messageBytes, out _, IntPtr.Zero))
|
||||
{
|
||||
throw new Win32Exception();
|
||||
}
|
||||
|
||||
if(messageBytes == Mailslot.MailslotNoMessage)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
byte[] bBuffer = new byte[messageBytes];
|
||||
|
||||
if(!Mailslot.ReadFile(_handle, bBuffer, messageBytes, out int bytesRead, IntPtr.Zero) || bytesRead == 0)
|
||||
{
|
||||
throw new Win32Exception();
|
||||
}
|
||||
|
||||
return Encoding.ASCII.GetString(bBuffer);
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
if(_handle != null)
|
||||
{
|
||||
_handle.Close();
|
||||
_handle = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,104 @@
|
||||
//******************************************************************************//
|
||||
// PacketsParser.cs
|
||||
// 12/4/2023
|
||||
//
|
||||
// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
// PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
// AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
// UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
// RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
// CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
// OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
// COMPANY.
|
||||
//
|
||||
// THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
//
|
||||
// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
//
|
||||
// WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
// EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
// BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
// 120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
// 730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
// OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
// LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
// BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
// APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
// PENALTIES.
|
||||
//
|
||||
// DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
// FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
// INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
// DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
// RECONSTRUCTION OF THE DOCUMENT.
|
||||
// POC: Alex Kravchenko (1118268)
|
||||
//******************************************************************************//
|
||||
using NLog;
|
||||
using Raytheon.LogDashboard.Model;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Runtime.Serialization;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using System.Xml;
|
||||
|
||||
namespace Raytheon.LogDashboard.Parsers
|
||||
{
|
||||
[Serializable]
|
||||
[DataContract]
|
||||
public abstract class PacketsParser : IDisposable
|
||||
{
|
||||
protected static readonly Logger Logger = LogManager.GetCurrentClassLogger();
|
||||
|
||||
protected readonly XmlParserContext XmlContext;
|
||||
protected readonly Encoding Encoding = Encoding.ASCII;
|
||||
|
||||
public string Address { get; protected set; }
|
||||
|
||||
public bool IsInitialized { get; protected set; }
|
||||
public List<IgnoredIPAddr> IgnoredIPs { get; set; }
|
||||
|
||||
public string Name { get; set; }
|
||||
|
||||
public CancellationTokenSource CancellationToken { get; set; }
|
||||
|
||||
public bool IsAutoSave { get; set; }
|
||||
|
||||
public PacketsParser(string name, bool isAutoSave)
|
||||
{
|
||||
Name = name;
|
||||
|
||||
XmlContext = CreateContext();
|
||||
IgnoredIPs = Settings.Instance.IgnoredIPs;
|
||||
IsAutoSave = isAutoSave;
|
||||
}
|
||||
|
||||
public virtual bool Init()
|
||||
{
|
||||
CancellationToken = new CancellationTokenSource();
|
||||
return true;
|
||||
}
|
||||
|
||||
public abstract LogMessage GetLog();
|
||||
|
||||
protected XmlParserContext CreateContext()
|
||||
{
|
||||
NameTable nt = new NameTable();
|
||||
XmlNamespaceManager nsmanager = new XmlNamespaceManager(nt);
|
||||
nsmanager.AddNamespace("log4j", "http://jakarta.apache.org/log4j/");
|
||||
nsmanager.AddNamespace("nlog", "http://nlog-project.org");
|
||||
return new XmlParserContext(nt, nsmanager, "elem", XmlSpace.None, Encoding.UTF8);
|
||||
}
|
||||
|
||||
protected DateTime UnixTimeStampToDateTime(long unixTimeStamp)
|
||||
{
|
||||
return new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc).AddMilliseconds(unixTimeStamp);
|
||||
}
|
||||
|
||||
public virtual void Dispose()
|
||||
{
|
||||
CancellationToken?.Cancel();
|
||||
IsInitialized = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,236 @@
|
||||
//******************************************************************************//
|
||||
// UDPPacketsParser.cs
|
||||
// 12/4/2023
|
||||
//
|
||||
// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
// PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
// AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
// UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
// RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
// CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
// OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
// COMPANY.
|
||||
//
|
||||
// THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
//
|
||||
// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
//
|
||||
// WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
// EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
// BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
// 120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
// 730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
// OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
// LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
// BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
// APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
// PENALTIES.
|
||||
//
|
||||
// DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
// FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
// INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
// DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
// RECONSTRUCTION OF THE DOCUMENT.
|
||||
// POC: Alex Kravchenko (1118268)
|
||||
//******************************************************************************//
|
||||
using Raytheon.LogDashboard.Model;
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Net.Sockets;
|
||||
using System.Net;
|
||||
using System.Xml;
|
||||
using Raytheon.LogDashboard.Helpers;
|
||||
using Settings = Raytheon.LogDashboard.Model.Settings;
|
||||
using GalaSoft.MvvmLight.Messaging;
|
||||
|
||||
namespace Raytheon.LogDashboard.Parsers
|
||||
{
|
||||
public class UDPPacketsParser : PacketsParser
|
||||
{
|
||||
private UdpClient udpClient;
|
||||
private IPEndPoint remoteIpEndPoint;
|
||||
|
||||
public int Port { get; set; }
|
||||
|
||||
public UDPPacketsParser(string name, bool isAutoSave)
|
||||
: base(name, isAutoSave)
|
||||
{
|
||||
}
|
||||
|
||||
public UDPPacketsParser(string name, string address, int port, bool isAutoSave)
|
||||
: this(name, isAutoSave)
|
||||
{
|
||||
Address = address;
|
||||
Port = port;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// initialize UDP parser
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public override bool Init()
|
||||
{
|
||||
try
|
||||
{
|
||||
base.Init();
|
||||
udpClient = new UdpClient(Port);
|
||||
remoteIpEndPoint = new IPEndPoint(IPAddress.Any, Port);
|
||||
IsInitialized = true;
|
||||
return IsInitialized;
|
||||
}
|
||||
catch(SocketException socketException)
|
||||
{
|
||||
Logger.Warn(socketException, "An error occurred in UDPPacketsParser ctor.");
|
||||
Messenger.Default.Send($"Port {Port} is busy!", "DisplayCustomMessage");
|
||||
|
||||
IsInitialized = false;
|
||||
return IsInitialized;
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
Logger.Warn(e, "An error occurred in UDPPacketsParser ctor.");
|
||||
Messenger.Default.Send($"An error occurred while connect to port {Port}.\n{e.Message}", "DisplayCustomMessage");
|
||||
IsInitialized = false;
|
||||
return IsInitialized;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// read individual message
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public override LogMessage GetLog()
|
||||
{
|
||||
LogMessage log = null;
|
||||
string incomingLog = string.Empty;
|
||||
|
||||
if(udpClient == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
// getting bytes
|
||||
byte[] receiveBytes = udpClient.Receive(ref remoteIpEndPoint);
|
||||
if(IgnoredIPs.Any(x => x.IsActive && x.IP.Contains(remoteIpEndPoint.Address.ToString())))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
// converting bytes to string
|
||||
incomingLog = Encoding.GetString(receiveBytes);
|
||||
|
||||
log = ReadXmlLog(incomingLog);
|
||||
log.Address = Settings.Instance.IsSeparateIPLoggersByPort ? $"{remoteIpEndPoint.Address}:{Port}" : remoteIpEndPoint.Address.ToString();
|
||||
log.Port = Port;
|
||||
}
|
||||
catch(SocketException)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
log = new LogMessage
|
||||
{
|
||||
Logger = "UDP Logger",
|
||||
Address = Settings.Instance.IsSeparateIPLoggersByPort ? $"{remoteIpEndPoint.Address}:{Port}" : remoteIpEndPoint.Address.ToString(),
|
||||
Thread = -1,
|
||||
Message = $"An error occurred while parsing log: {incomingLog}. {Environment.NewLine} Exception: {e}",
|
||||
Time = DateTime.Now,
|
||||
Level = DashboardLogLevel.Error,
|
||||
ExecutableName = "LogDashboard"
|
||||
};
|
||||
|
||||
Logger.Warn(e, "An error occurred while parsing log.");
|
||||
}
|
||||
|
||||
if(IsAutoSave)
|
||||
{
|
||||
Messenger.Default.Send(log, "PersistLogMessage");
|
||||
}
|
||||
return log;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// reads XML log in log4j format
|
||||
/// </summary>
|
||||
/// <param name="xmlFragment"></param>
|
||||
/// <returns></returns>
|
||||
/// <exception cref="Exception"></exception>
|
||||
private LogMessage ReadXmlLog(string xmlFragment)
|
||||
{
|
||||
LogMessage log = new LogMessage();
|
||||
|
||||
using(XmlReader reader = new XmlTextReader(xmlFragment, XmlNodeType.Element, XmlContext) { WhitespaceHandling = WhitespaceHandling.Significant })
|
||||
{
|
||||
reader.Read();
|
||||
if(reader.MoveToContent() != XmlNodeType.Element || reader.Name != "log4j:event")
|
||||
{
|
||||
throw new Exception("The Log Event is not a valid log4j Xml block.");
|
||||
}
|
||||
|
||||
log.Logger = reader.GetAttribute("logger");
|
||||
log.Level = (DashboardLogLevel)Enum.Parse(typeof(DashboardLogLevel), reader.GetAttribute("level").ToLower().FirstCharToUpper());
|
||||
log.Thread = int.Parse(reader.GetAttribute("thread"));
|
||||
|
||||
if(long.TryParse(reader.GetAttribute("timestamp"), out long timeStamp))
|
||||
{
|
||||
log.Time = UnixTimeStampToDateTime(timeStamp).ToLocalTime();
|
||||
}
|
||||
|
||||
int eventDepth = reader.Depth;
|
||||
reader.Read();
|
||||
while(reader.Depth > eventDepth)
|
||||
{
|
||||
if(reader.MoveToContent() == XmlNodeType.Element)
|
||||
{
|
||||
switch(reader.Name)
|
||||
{
|
||||
case "log4j:message":
|
||||
log.Message = reader.ReadString();
|
||||
break;
|
||||
|
||||
case "log4j:throwable":
|
||||
log.Message += Environment.NewLine + reader.ReadString();
|
||||
break;
|
||||
case "log4j:properties":
|
||||
reader.Read();
|
||||
while(reader.MoveToContent() == XmlNodeType.Element
|
||||
&& reader.Name == "log4j:data")
|
||||
{
|
||||
string name = reader.GetAttribute("name");
|
||||
string value = reader.GetAttribute("value");
|
||||
if(!string.IsNullOrEmpty(name) && name == "log4japp" && !string.IsNullOrEmpty(value) && value.Contains(".exe"))
|
||||
{
|
||||
log.ExecutableName = value.Substring(0, value.IndexOf(".exe", StringComparison.Ordinal));
|
||||
}
|
||||
|
||||
reader.Read();
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
reader.Read();
|
||||
}
|
||||
}
|
||||
return log;
|
||||
}
|
||||
|
||||
public override void Dispose()
|
||||
{
|
||||
base.Dispose();
|
||||
try
|
||||
{
|
||||
udpClient?.Close();
|
||||
udpClient?.Dispose();
|
||||
udpClient = null;
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
Logger.Warn(e, "Dispose error");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,174 @@
|
||||
//******************************************************************************//
|
||||
// WCFPacketsParser.cs
|
||||
// 12/4/2023
|
||||
//
|
||||
// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
// PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
// AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
// UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
// RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
// CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
// OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
// COMPANY.
|
||||
//
|
||||
// THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
//
|
||||
// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
//
|
||||
// WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
// EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
// BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
// 120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
// 730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
// OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
// LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
// BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
// APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
// PENALTIES.
|
||||
//
|
||||
// DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
// FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
// INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
// DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
// RECONSTRUCTION OF THE DOCUMENT.
|
||||
// POC: Alex Kravchenko (1118268)
|
||||
//******************************************************************************//
|
||||
using Raytheon.LogDashboard.Model;
|
||||
using System;
|
||||
using System.Net.Sockets;
|
||||
using Raytheon.LogDashboard.Service;
|
||||
using GalaSoft.MvvmLight.Messaging;
|
||||
using System.Collections.Generic;
|
||||
using NLog;
|
||||
using System.Linq;
|
||||
|
||||
namespace Raytheon.LogDashboard.Parsers
|
||||
{
|
||||
public class WCFPacketsParser : PacketsParser
|
||||
{
|
||||
private ITRSInfoServiceHost _serviceHost;
|
||||
private readonly Queue<LogMessage> _messages = new Queue<LogMessage>();
|
||||
|
||||
public WCFPacketsParser(string name, bool isAutoSave)
|
||||
: base(name, isAutoSave)
|
||||
{
|
||||
}
|
||||
public WCFPacketsParser(string name, string address, bool isAutoSave)
|
||||
: this(name, isAutoSave)
|
||||
{
|
||||
Address = address;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// initialize WCF packet receiver / parser
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public override bool Init()
|
||||
{
|
||||
try
|
||||
{
|
||||
base.Init();
|
||||
|
||||
if(!string.IsNullOrEmpty(Address))
|
||||
{
|
||||
_serviceHost = new TRSInfoServiceHost();
|
||||
_serviceHost.StartHost(Address);
|
||||
}
|
||||
|
||||
Messenger.Default.Register<NotificationMessage<LogMessage>>(this, "WCFMessage", MessageReceivedHandler);
|
||||
Messenger.Default.Register<LogEventInfo>(this, "AddProcessingText", AddProcessingTextHandler);
|
||||
|
||||
IsInitialized = true;
|
||||
return IsInitialized;
|
||||
}
|
||||
catch(SocketException socketException)
|
||||
{
|
||||
Logger.Warn(socketException, "An error occurred in WCFPacketsParser initializer.");
|
||||
IsInitialized = false;
|
||||
return IsInitialized;
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
Logger.Warn(e, "An error occurred in WCFPacketsParser initializer.");
|
||||
IsInitialized = false;
|
||||
return IsInitialized;
|
||||
}
|
||||
}
|
||||
|
||||
private void AddProcessingTextHandler(LogEventInfo info)
|
||||
{
|
||||
var threadIdProperty = info.Properties.FirstOrDefault(p => p.Key.ToString() == "ThreadId");
|
||||
int threadId = threadIdProperty.Key != null ? (int)threadIdProperty.Value : 0;
|
||||
|
||||
LogMessage logMessage = new LogMessage
|
||||
{
|
||||
Logger = info.LoggerName,
|
||||
ThreadName = info.LoggerName,
|
||||
Address = string.IsNullOrEmpty(Address) ? Environment.MachineName : Address,
|
||||
Message = info.Message,
|
||||
Time = info.TimeStamp,
|
||||
Thread = threadId,
|
||||
Level = FromNLogLevelToDashboardLevel(info.Level.ToString()),
|
||||
ExecutableName = "LogDashboard"
|
||||
};
|
||||
_messages.Enqueue(logMessage);
|
||||
}
|
||||
|
||||
public static DashboardLogLevel FromNLogLevelToDashboardLevel(string level)
|
||||
{
|
||||
switch(level.ToUpper())
|
||||
{
|
||||
case "INFOPOPUP":
|
||||
case "INFO":
|
||||
return Model.DashboardLogLevel.Info;
|
||||
case "DEBUGPOPUP":
|
||||
case "DEBUG":
|
||||
return Model.DashboardLogLevel.Debug;
|
||||
case "TRACE":
|
||||
return Model.DashboardLogLevel.Trace;
|
||||
case "ERROR":
|
||||
return Model.DashboardLogLevel.Error;
|
||||
case "WARN":
|
||||
return Model.DashboardLogLevel.Warn;
|
||||
case "FATAL":
|
||||
case "CRITICAL":
|
||||
return Model.DashboardLogLevel.Fatal;
|
||||
default:
|
||||
return Model.DashboardLogLevel.Error;
|
||||
}
|
||||
}
|
||||
|
||||
private void MessageReceivedHandler(NotificationMessage<LogMessage> message)
|
||||
{
|
||||
LogMessage logMessage = message?.Content;
|
||||
if(logMessage == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
logMessage.Address = Address;
|
||||
_messages.Enqueue(logMessage);
|
||||
}
|
||||
|
||||
public override LogMessage GetLog()
|
||||
{
|
||||
var log = _messages.Count > 0 ? _messages.Dequeue() : null;
|
||||
|
||||
if(IsAutoSave && log != null)
|
||||
{
|
||||
Messenger.Default.Send(log, "PersistLogMessage");
|
||||
}
|
||||
|
||||
return log;
|
||||
}
|
||||
|
||||
public override void Dispose()
|
||||
{
|
||||
base.Dispose();
|
||||
_serviceHost?.StopHost();
|
||||
|
||||
Messenger.Default.Unregister<NotificationMessage<LogMessage>>(this, "WCFMessage", MessageReceivedHandler);
|
||||
Messenger.Default.Unregister<LogEventInfo>(this, "AddProcessingText", AddProcessingTextHandler);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,110 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<ArrayOfReleaseNotes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
|
||||
|
||||
<ReleaseNotes>
|
||||
<Version>1.4.1</Version>
|
||||
<NewFeatures>
|
||||
<string>Support for dynamically changing file location based on the Error Logger settings</string>
|
||||
<string>New toggle switch for monitoring Error Logger ini file for the current file location</string>
|
||||
</NewFeatures>
|
||||
<ChangedFeatures>
|
||||
<string>Removed the dependency on EP.DataContracts package.</string>
|
||||
<string>When writing log files based on the Error Logger location, use the same methods for naming files, start with the base name first and rename with the date stamp only when file reach maximum file length.</string>
|
||||
</ChangedFeatures>
|
||||
<FixedBugs>
|
||||
<string>Parsing of the log files with 3 columns</string>
|
||||
<string>Fix for the dialog when importing multiple log file of different types</string>
|
||||
</FixedBugs>
|
||||
</ReleaseNotes>
|
||||
|
||||
<ReleaseNotes>
|
||||
<Version>1.3.9</Version>
|
||||
<NewFeatures>
|
||||
<string>Added support for persisting log records into a rolling file based on a file size</string>
|
||||
<string>Added support for parsing Error Logger csv files</string>
|
||||
<string>Added identification for the Error Logger running. If Error Logger detected, display informational message to the user</string>
|
||||
</NewFeatures>
|
||||
<ChangedFeatures>
|
||||
</ChangedFeatures>
|
||||
<FixedBugs>
|
||||
<string>Fixed a bug for displaying error messages as a Metro dialog</string>
|
||||
</FixedBugs>
|
||||
</ReleaseNotes>
|
||||
|
||||
<ReleaseNotes>
|
||||
<Version>1.3.6</Version>
|
||||
<NewFeatures>
|
||||
<string>- Updated the default icon</string>
|
||||
</NewFeatures>
|
||||
<ChangedFeatures>
|
||||
<string>Added drop-down control for selecting 32 bit and 64 bit Error Logger</string>
|
||||
</ChangedFeatures>
|
||||
<FixedBugs>
|
||||
<string>Error Logger initialization with the correct mutex when running 64 bit version</string>
|
||||
</FixedBugs>
|
||||
</ReleaseNotes>
|
||||
|
||||
<ReleaseNotes>
|
||||
<Version>1.3.5</Version>
|
||||
<NewFeatures>
|
||||
<string>- Added support Dark mode</string>
|
||||
<string>- Added full system color support</string>
|
||||
<string>- Added embedded mode so that it can be hosted inside other applications like EPTS</string>
|
||||
</NewFeatures>
|
||||
<ChangedFeatures>
|
||||
<string>Windows Debug parser to display machine name as a source</string>
|
||||
</ChangedFeatures>
|
||||
<FixedBugs>
|
||||
<string>Error Logger parser is checking for null handle avoiding exception when MailSlot failed to initialize</string>
|
||||
</FixedBugs>
|
||||
</ReleaseNotes>
|
||||
|
||||
<ReleaseNotes>
|
||||
<Version>1.3.2</Version>
|
||||
<NewFeatures>
|
||||
<string>- Added support for parsing EPTS log files</string>
|
||||
</NewFeatures>
|
||||
<ChangedFeatures>
|
||||
<string>- removed normalization for the new line character when parsing xml (log4j format)</string>
|
||||
</ChangedFeatures>
|
||||
<FixedBugs>
|
||||
<string>fixed a bug in EPTS log file parser for skipping first and last lines</string>
|
||||
<string>stopping and starting receivers was not picking up the enabled receivers from the list</string>
|
||||
<string>overwriting custom receiver name with the default name after saving in configuration</string>
|
||||
</FixedBugs>
|
||||
</ReleaseNotes>
|
||||
|
||||
<ReleaseNotes>
|
||||
<Version>1.0.2</Version>
|
||||
<NewFeatures>
|
||||
<string>- Added new ErrorLogger receiver capable of reading from Mailslot</string>
|
||||
<string>- Added new WinDebug receiver based on Microsoft's 'dbmon' example </string>
|
||||
</NewFeatures>
|
||||
<ChangedFeatures>
|
||||
<string>- Moved LogDashboard to separate DLL</string>
|
||||
<string>- Packaged LogDashboardCtrl as a package to be reused</string>
|
||||
</ChangedFeatures>
|
||||
<FixedBugs>
|
||||
</FixedBugs>
|
||||
</ReleaseNotes>
|
||||
|
||||
<ReleaseNotes>
|
||||
<Version>1.0.0</Version>
|
||||
<NewFeatures>
|
||||
<string>- Default Receiver is UDP listening on port 7777
|
||||
Define your target in NLog.config as type=Chainsaw and address=udp://127.0.0.1:7777
|
||||
</string>
|
||||
<string>- Ability to import log4j format files</string>
|
||||
<string>- Track file changes after importing the file</string>
|
||||
<string>- Fast sorting and filtering capabilities</string>
|
||||
<string>- Sorting and filtering based on the namespace from tree view</string>
|
||||
<string>- Sorting and filtering based on time stamps</string>
|
||||
</NewFeatures>
|
||||
<ChangedFeatures>
|
||||
<string>- Nothing Yet</string>
|
||||
</ChangedFeatures>
|
||||
<FixedBugs>
|
||||
<string>- Nothing Yet</string>
|
||||
</FixedBugs>
|
||||
</ReleaseNotes>
|
||||
</ArrayOfReleaseNotes>
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 41 KiB |
@@ -0,0 +1,73 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
// Runtime Version:4.0.30319.42000
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
namespace Raytheon.LogDashboard.Resources {
|
||||
using System;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// A strongly-typed resource class, for looking up localized strings, etc.
|
||||
/// </summary>
|
||||
// This class was auto-generated by the StronglyTypedResourceBuilder
|
||||
// class via a tool like ResGen or Visual Studio.
|
||||
// To add or remove a member, edit your .ResX file then rerun ResGen
|
||||
// with the /str option, or rebuild your VS project.
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
internal class Resource1 {
|
||||
|
||||
private static global::System.Resources.ResourceManager resourceMan;
|
||||
|
||||
private static global::System.Globalization.CultureInfo resourceCulture;
|
||||
|
||||
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
|
||||
internal Resource1() {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns the cached ResourceManager instance used by this class.
|
||||
/// </summary>
|
||||
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||
internal static global::System.Resources.ResourceManager ResourceManager {
|
||||
get {
|
||||
if (object.ReferenceEquals(resourceMan, null)) {
|
||||
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Raytheon.LogDashboard.Resources.Resource1", typeof(Resource1).Assembly);
|
||||
resourceMan = temp;
|
||||
}
|
||||
return resourceMan;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Overrides the current thread's CurrentUICulture property for all
|
||||
/// resource lookups using this strongly typed resource class.
|
||||
/// </summary>
|
||||
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||
internal static global::System.Globalization.CultureInfo Culture {
|
||||
get {
|
||||
return resourceCulture;
|
||||
}
|
||||
set {
|
||||
resourceCulture = value;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Icon similar to (Icon).
|
||||
/// </summary>
|
||||
internal static System.Drawing.Icon LogDashboard {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("LogDashboard", resourceCulture);
|
||||
return ((System.Drawing.Icon)(obj));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,124 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
||||
<data name="LogDashboard" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>LogDashboard.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
</root>
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 7.8 KiB |
@@ -0,0 +1,51 @@
|
||||
//******************************************************************************//
|
||||
// ITRSInfoServiceHost.cs
|
||||
// 12/4/2023
|
||||
//
|
||||
// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
// PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
// AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
// UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
// RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
// CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
// OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
// COMPANY.
|
||||
//
|
||||
// THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
//
|
||||
// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
//
|
||||
// WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
// EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
// BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
// 120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
// 730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
// OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
// LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
// BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
// APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
// PENALTIES.
|
||||
//
|
||||
// DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
// FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
// INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
// DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
// RECONSTRUCTION OF THE DOCUMENT.
|
||||
// POC: Alex Kravchenko (1118268)
|
||||
//******************************************************************************//
|
||||
|
||||
namespace Raytheon.LogDashboard.Service
|
||||
{
|
||||
public interface ITRSInfoServiceHost
|
||||
{
|
||||
/// <summary>
|
||||
/// The implementer of this interface will start the service host WCF or Named Pipes
|
||||
/// </summary>
|
||||
void StartHost(string address);
|
||||
|
||||
/// <summary>
|
||||
/// The implementer of this interface will stop the service host WCF or Named Pipes
|
||||
/// </summary>
|
||||
void StopHost();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,101 @@
|
||||
//******************************************************************************//
|
||||
// ITestInfoService.cs
|
||||
// 12/4/2023
|
||||
//
|
||||
// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
// PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
// AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
// UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
// RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
// CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
// OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
// COMPANY.
|
||||
//
|
||||
// THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
//
|
||||
// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
//
|
||||
// WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
// EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
// BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
// 120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
// 730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
// OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
// LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
// BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
// APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
// PENALTIES.
|
||||
//
|
||||
// DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
// FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
// INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
// DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
// RECONSTRUCTION OF THE DOCUMENT.
|
||||
// POC: Alex Kravchenko (1118268)
|
||||
//******************************************************************************//
|
||||
using System.Collections.Generic;
|
||||
using System.ServiceModel;
|
||||
|
||||
namespace Raytheon.LogDashboard.Service
|
||||
{
|
||||
[ServiceContract(CallbackContract = typeof(ISubscriptionCallback))]
|
||||
public interface ITestInfoService
|
||||
{
|
||||
[OperationContract]
|
||||
void ProcessScannedData(string barcodeData);
|
||||
|
||||
[OperationContract(IsOneWay = true)]
|
||||
void SubscribeToDataEntry(string keyName);
|
||||
|
||||
[OperationContract(IsOneWay = true)]
|
||||
void UnsubscribeFromDataEntry(string keyName);
|
||||
|
||||
[OperationContract]
|
||||
void SetParseProfile(string parseProfilePath);
|
||||
|
||||
[OperationContract]
|
||||
IDictionary<string, string> GetStoredScanData();
|
||||
|
||||
[OperationContract]
|
||||
bool IsAlive();
|
||||
|
||||
[OperationContract]
|
||||
void MoveWindowToFront();
|
||||
|
||||
[OperationContract(IsOneWay = true)]
|
||||
void ReportMessage(string message);
|
||||
|
||||
[OperationContract(IsOneWay = true)]
|
||||
void LogMessage(string level, string message);
|
||||
}
|
||||
|
||||
[ServiceContract(CallbackContract = typeof(IOperatorInterfaceCallback))]
|
||||
public interface IOperatorInterface
|
||||
{
|
||||
[OperationContract(IsOneWay = true)]
|
||||
void Handshake(string caller);
|
||||
|
||||
[OperationContract(IsOneWay = true)]
|
||||
void MenuCommand(string command);
|
||||
}
|
||||
|
||||
[ServiceContract]
|
||||
public interface ISubscriptionCallback
|
||||
{
|
||||
[OperationContract(IsOneWay = true)]
|
||||
void Notify();
|
||||
|
||||
[OperationContract(IsOneWay = true)]
|
||||
void NotifyScan(Dictionary<string, string> data);
|
||||
}
|
||||
|
||||
[ServiceContract]
|
||||
public interface IOperatorInterfaceCallback
|
||||
{
|
||||
[OperationContract(IsOneWay = true)]
|
||||
void CallMethod(string methodName, string parameter);
|
||||
|
||||
[OperationContract]
|
||||
bool IsSequenceRunning();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,68 @@
|
||||
//******************************************************************************//
|
||||
// TRSInfoServiceHost.cs
|
||||
// 12/4/2023
|
||||
//
|
||||
// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
// PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
// AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
// UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
// RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
// CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
// OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
// COMPANY.
|
||||
//
|
||||
// THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
//
|
||||
// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
//
|
||||
// WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
// EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
// BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
// 120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
// 730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
// OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
// LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
// BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
// APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
// PENALTIES.
|
||||
//
|
||||
// DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
// FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
// INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
// DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
// RECONSTRUCTION OF THE DOCUMENT.
|
||||
// POC: Alex Kravchenko (1118268)
|
||||
//******************************************************************************//
|
||||
using NLog;
|
||||
using System;
|
||||
using System.ServiceModel;
|
||||
|
||||
namespace Raytheon.LogDashboard.Service
|
||||
{
|
||||
public class TRSInfoServiceHost : ITRSInfoServiceHost
|
||||
{
|
||||
static ServiceHost _host;
|
||||
readonly ILogger _log = LogManager.GetCurrentClassLogger();
|
||||
|
||||
public void StartHost(string address)
|
||||
{
|
||||
_log.Info("Starting TRS Info Service");
|
||||
try
|
||||
{
|
||||
_host = new ServiceHost(typeof(TestInfoService), new Uri[] { new Uri(address) });
|
||||
_host.AddServiceEndpoint(typeof(ITestInfoService), new NetNamedPipeBinding(), address);
|
||||
_host.Open();
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
_log.Error(ex, "Unable to start service host TRS Service, please check configuration");
|
||||
}
|
||||
}
|
||||
|
||||
public void StopHost()
|
||||
{
|
||||
_log.Info("Stopping TRS Info Service");
|
||||
_host.Close();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,180 @@
|
||||
//******************************************************************************//
|
||||
// TestInfoService.cs
|
||||
// 12/4/2023
|
||||
//
|
||||
// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
// PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
// AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
// UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
// RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
// CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
// OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
// COMPANY.
|
||||
//
|
||||
// THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
//
|
||||
// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
//
|
||||
// WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
// EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
// BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
// 120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
// 730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
// OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
// LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
// BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
// APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
// PENALTIES.
|
||||
//
|
||||
// DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
// FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
// INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
// DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
// RECONSTRUCTION OF THE DOCUMENT.
|
||||
// POC: Alex Kravchenko (1118268)
|
||||
//******************************************************************************//
|
||||
|
||||
// Ignore Spelling: Unsubscribe
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ServiceModel;
|
||||
using GalaSoft.MvvmLight.Messaging;
|
||||
using NLog;
|
||||
using Raytheon.LogDashboard.Parsers;
|
||||
|
||||
namespace Raytheon.LogDashboard.Service
|
||||
{
|
||||
[ServiceBehavior(Name = "TestInfoService",
|
||||
Namespace = "http://epts.data.us.ray.com/EPTS/TRS",
|
||||
InstanceContextMode = InstanceContextMode.PerSession,
|
||||
ConcurrencyMode = ConcurrencyMode.Multiple)]
|
||||
public class TestInfoService : ITestInfoService
|
||||
{
|
||||
/// <summary>
|
||||
/// Logger
|
||||
/// </summary>
|
||||
private readonly ILogger _log = LogManager.GetCurrentClassLogger();
|
||||
|
||||
/// <summary>
|
||||
/// Used to set the parse profile path to be used when parsing scan data
|
||||
/// </summary>
|
||||
/// <param name="parseProfilePath"></param>
|
||||
public void SetParseProfile(string parseProfilePath)
|
||||
{
|
||||
_log.Debug($"Setting Parse Profile for path: {parseProfilePath}");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Used to subscribe to the Data Entry Accept event
|
||||
/// The name of the client's pipeServer is provided for Data Entry to be able to call out to it
|
||||
/// </summary>
|
||||
/// <param name="keyName"></param>
|
||||
public void SubscribeToDataEntry(string keyName)
|
||||
{
|
||||
_log.Debug($"Subscribing to Data Entry with key: {keyName}");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Unsubscripted from data entry.
|
||||
/// </summary>
|
||||
/// <param name="keyName">Name of the key.</param>
|
||||
/// <exception cref="System.NotImplementedException"></exception>
|
||||
public void UnsubscribeFromDataEntry(string keyName)
|
||||
{
|
||||
_log.Debug($"Unsubscribing from Data Entry with key: {keyName}");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Used to retrieve accepted data
|
||||
/// This will continue to return the previous scan entry until a new scan is accepted in the UI
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public IDictionary<string, string> GetStoredScanData()
|
||||
{
|
||||
_log.Debug("Getting Stored Scan Data");
|
||||
return null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// BCCapture will call this method via WCF
|
||||
/// //
|
||||
/// Parse the string that BCCapture passes.
|
||||
/// Determine if it is DES data scan or RSS scan
|
||||
/// If DES data scan
|
||||
/// Call Message.Send.Default
|
||||
/// Else (RSS scan)
|
||||
/// Create a new Test Session
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public void ProcessScannedData(string scannedData)
|
||||
{
|
||||
_log.Debug($"Received Scan Data {scannedData}");
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// A call that lets the client end check to see if the endpoint is available.
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public bool IsAlive()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Used to move the TRS window to active/ to front
|
||||
/// </summary>
|
||||
public void MoveWindowToFront()
|
||||
{
|
||||
_log.Debug("Move Window to the Front call");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// will process messages submitted by texPrint
|
||||
/// </summary>
|
||||
/// <param name="message"></param>
|
||||
public void ReportMessage(string message)
|
||||
{
|
||||
_log.Debug("Report Message call");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Logs the message via local log4net.
|
||||
/// </summary>
|
||||
/// <param name="level">The level.</param>
|
||||
/// <param name="message">The message.</param>
|
||||
public void LogMessage(string level, string message)
|
||||
{
|
||||
Messenger.Default.Send(new NotificationMessage<Model.LogMessage>(new Model.LogMessage
|
||||
{
|
||||
Level = WCFPacketsParser.FromNLogLevelToDashboardLevel(level),
|
||||
Address = "EPTS",
|
||||
Logger = "EPTS",
|
||||
Message = message,
|
||||
Time = DateTime.Now,
|
||||
},
|
||||
level), "WCFMessage");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Handshake with Common Operator Interface.
|
||||
/// </summary>
|
||||
/// <param name="caller">The caller.</param>
|
||||
/// <exception cref="NotImplementedException"></exception>
|
||||
public void Handshake(string caller)
|
||||
{
|
||||
_log.Debug($"Handshake Message Received from caller: {caller}");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Menus the command.
|
||||
/// </summary>
|
||||
/// <param name="command">The command.</param>
|
||||
/// <exception cref="NotImplementedException"></exception>
|
||||
public void MenuCommand(string command)
|
||||
{
|
||||
_log.Debug($"Menu Command Received command: {command}");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,644 @@
|
||||
<!--
|
||||
DrawingImages.xaml
|
||||
12/4/2023
|
||||
|
||||
RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
COMPANY.
|
||||
|
||||
THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
|
||||
UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
|
||||
WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
PENALTIES.
|
||||
|
||||
DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
RECONSTRUCTION OF THE DOCUMENT.
|
||||
POC: Alex Kravchenko (1118268)
|
||||
-->
|
||||
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
>
|
||||
|
||||
<DrawingImage x:Key="PauseImage">
|
||||
<DrawingImage.Drawing>
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="M150.001,0c-82.838,0-150,67.159-150,150c0,82.838,67.162,150.003,150,150.003c82.843,0,150-67.165,150-150.003 C300.001,67.159,232.846,0,150.001,0z M134.41,194.538c0,9.498-7.7,17.198-17.198,17.198s-17.198-7.7-17.198-17.198V105.46 c0-9.498,7.7-17.198,17.198-17.198s17.198,7.7,17.198,17.198V194.538z M198.955,194.538c0,9.498-7.701,17.198-17.198,17.198 c-9.498,0-17.198-7.7-17.198-17.198V105.46c0-9.498,7.7-17.198,17.198-17.198s17.198,7.7,17.198,17.198V194.538z"/>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
<DrawingImage x:Key="PlayImage">
|
||||
<DrawingImage.Drawing>
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="M409.133,109.203c-19.608-33.592-46.205-60.189-79.798-79.796C295.736,9.801,259.058,0,219.273,0 c-39.781,0-76.466,9.801-110.063,29.407c-33.595,19.604-60.192,46.201-79.8,79.796C9.801,142.8,0,179.489,0,219.267 s9.804,76.463,29.407,110.062c19.607,33.585,46.204,60.189,79.799,79.798c33.597,19.605,70.283,29.407,110.063,29.407 s76.47-9.802,110.065-29.407c33.593-19.602,60.189-46.206,79.795-79.798c19.603-33.599,29.403-70.287,29.403-110.062 C438.533,179.489,428.732,142.795,409.133,109.203z M328.904,234.966L173.588,326.33c-2.856,1.711-5.902,2.567-9.136,2.567 c-3.045,0-6.09-0.764-9.135-2.286c-6.09-3.614-9.136-8.939-9.136-15.985V127.907c0-7.041,3.046-12.371,9.136-15.987 c6.28-3.427,12.369-3.333,18.271,0.284l155.316,91.36c6.088,3.424,9.134,8.663,9.134,15.703 C338.038,226.308,334.992,231.537,328.904,234.966z"/>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
<DrawingImage x:Key="PauseWhiteImage">
|
||||
<DrawingImage.Drawing>
|
||||
<DrawingGroup>
|
||||
<DrawingGroup>
|
||||
<GeometryDrawing Brush="White" Geometry="F1 M300.003,300.003z M0,0z M150.001,0C67.163,0 0.00100000000000477,67.159 0.00100000000000477,150 0.00100000000000477,232.838 67.163,300.003 150.001,300.003 232.844,300.003 300.001,232.838 300.001,150 300.001,67.159 232.846,0 150.001,0z M134.41,194.538C134.41,204.036 126.71,211.736 117.212,211.736 107.714,211.736 100.014,204.036 100.014,194.538L100.014,105.46C100.014,95.962 107.714,88.262 117.212,88.262 126.71,88.262 134.41,95.962 134.41,105.46L134.41,194.538z M198.955,194.538C198.955,204.036 191.254,211.736 181.757,211.736 172.259,211.736 164.559,204.036 164.559,194.538L164.559,105.46C164.559,95.962 172.259,88.262 181.757,88.262 191.255,88.262 198.955,95.962 198.955,105.46L198.955,194.538z" />
|
||||
</DrawingGroup>
|
||||
</DrawingGroup>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
<DrawingImage x:Key="PlayWhiteImage">
|
||||
<DrawingImage.Drawing>
|
||||
<DrawingGroup>
|
||||
<GeometryDrawing Brush="White" Geometry="F1 M350,350z M0,0z M175,0C78.343,0 0,78.343 0,175 0,271.656 78.343,350 175,350 271.656,350 350,271.656 350,175 350,78.343 271.656,0 175,0z M258.738,189.05L154.352,260.862C151.448,262.851 148.068,263.868 144.679,263.868 141.951,263.868 139.243,263.22 136.749,261.917 131.144,258.952 127.624,253.14 127.624,246.814L127.624,103.188C127.624,96.862 131.144,91.049 136.749,88.084 142.354,85.144 149.126,85.549 154.352,89.139L258.738,160.95C263.357,164.13 266.125,169.391 266.125,175 266.125,180.609 263.358,185.87 258.738,189.05z" />
|
||||
</DrawingGroup>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
<DrawingImage x:Key="PauseDisabledImage">
|
||||
<DrawingImage.Drawing>
|
||||
<GeometryDrawing Brush="DarkGray" Geometry="M150.001,0c-82.838,0-150,67.159-150,150c0,82.838,67.162,150.003,150,150.003c82.843,0,150-67.165,150-150.003 C300.001,67.159,232.846,0,150.001,0z M134.41,194.538c0,9.498-7.7,17.198-17.198,17.198s-17.198-7.7-17.198-17.198V105.46 c0-9.498,7.7-17.198,17.198-17.198s17.198,7.7,17.198,17.198V194.538z M198.955,194.538c0,9.498-7.701,17.198-17.198,17.198 c-9.498,0-17.198-7.7-17.198-17.198V105.46c0-9.498,7.7-17.198,17.198-17.198s17.198,7.7,17.198,17.198V194.538z"/>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
<DrawingImage x:Key="PlayDisabledImage">
|
||||
<DrawingImage.Drawing>
|
||||
<GeometryDrawing Brush="DarkGray" Geometry="M409.133,109.203c-19.608-33.592-46.205-60.189-79.798-79.796C295.736,9.801,259.058,0,219.273,0 c-39.781,0-76.466,9.801-110.063,29.407c-33.595,19.604-60.192,46.201-79.8,79.796C9.801,142.8,0,179.489,0,219.267 s9.804,76.463,29.407,110.062c19.607,33.585,46.204,60.189,79.799,79.798c33.597,19.605,70.283,29.407,110.063,29.407 s76.47-9.802,110.065-29.407c33.593-19.602,60.189-46.206,79.795-79.798c19.603-33.599,29.403-70.287,29.403-110.062 C438.533,179.489,428.732,142.795,409.133,109.203z M328.904,234.966L173.588,326.33c-2.856,1.711-5.902,2.567-9.136,2.567 c-3.045,0-6.09-0.764-9.135-2.286c-6.09-3.614-9.136-8.939-9.136-15.985V127.907c0-7.041,3.046-12.371,9.136-15.987 c6.28-3.427,12.369-3.333,18.271,0.284l155.316,91.36c6.088,3.424,9.134,8.663,9.134,15.703 C338.038,226.308,334.992,231.537,328.904,234.966z"/>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
<DrawingImage x:Key="DownImage">
|
||||
<DrawingImage.Drawing>
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="M306,0C137.012,0,0,136.992,0,306s137.012,306,306,306s306-137.012,306-306S475.008,0,306,0z M431.001,322.811 l-108.19,108.19c-4.59,4.59-10.862,6.005-16.811,4.953c-5.929,1.052-12.221-0.382-16.811-4.953l-108.19-108.19 c-7.478-7.478-7.478-19.583,0-27.042c7.478-7.478,19.584-7.478,27.043,0l78.833,78.814V172.125 c0-10.557,8.568-19.125,19.125-19.125c10.557,0,19.125,8.568,19.125,19.125v202.457l78.814-78.814 c7.478-7.478,19.584-7.478,27.042,0C438.46,303.227,438.46,315.333,431.001,322.811z"/>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
<DrawingImage x:Key="RightImage">
|
||||
<DrawingImage.Drawing>
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="F1 M 35,43L 35,25.5L 27,35L 27,25.25L 38,12.75L 49,25.25L 49,35L 41,25.5L 41,43L 35,43 Z M 17,38L 33,38L 33,42L 21,42L 21,53L 55,53L 55,42L 43,42L 43,38L 59,38L 59,57L 17,57L 17,38 Z M 33,46L 43,46L 43,49L 33,49L 33,46 Z "/>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
<DrawingImage x:Key="LeftImage">
|
||||
<DrawingImage.Drawing>
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="F1 M 35,13L 35,30.5L 27,21L 27,30.75L 38,43.25L 49,30.75L 49,21L 41,30.5L 41,13L 35,13 Z M 17,38L 30,38L 33.75,42L 21,42L 21,53L 55,53L 55,42L 42.25,42L 46,38L 59,38L 59,57L 17,57L 17,38 Z M 33,46L 43,46L 43,49L 33,49L 33,46 Z "/>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
<DrawingImage x:Key="UpImage">
|
||||
<DrawingImage.Drawing>
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="M306,0C137.012,0,0,136.992,0,306s137.012,306,306,306c169.008,0,306-137.012,306-306S475.008,0,306,0z M431.001,316.231 c-7.478,7.479-19.584,7.479-27.043,0l-78.833-78.813v202.457c0,10.557-8.568,19.125-19.125,19.125 c-10.557,0-19.125-8.568-19.125-19.125V237.418l-78.814,78.813c-7.478,7.479-19.584,7.479-27.043,0 c-7.478-7.478-7.478-19.583,0-27.042l108.19-108.19c4.571-4.571,10.863-6.005,16.792-4.953 c5.929-1.052,12.221,0.382,16.811,4.953l108.19,108.19C438.46,296.667,438.46,308.773,431.001,316.231z"/>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
<DrawingImage x:Key="AutoDownImage">
|
||||
<DrawingImage.Drawing>
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="M237.32,0.016C106.249,0.016,0,106.233,0,237.336s106.281,237.288,237.32,237.288 s237.32-106.249,237.32-237.32S368.391,0.016,237.32,0.016z M353.517,264.7l-106.344,94.044c-3.178,3.178-7.31,4.672-11.505,4.64 c-4.164,0-8.327-1.494-11.505-4.64L117.849,264.7c-6.229-6.229-6.229-16.4,0-22.597c6.229-6.261,16.368-6.261,22.597,0 l95.22,84.192l95.22-84.192c6.229-6.261,16.4-6.261,22.597,0C359.714,248.269,359.809,258.376,353.517,264.7z M353.517,150.665 l-106.312,94.076c-3.178,3.178-7.31,4.672-11.505,4.64c-4.195,0-8.359-1.494-11.537-4.64l-106.312-94.076 c-6.229-6.229-6.229-16.368,0-22.597c6.229-6.229,16.368-6.229,22.597,0l95.22,84.224l95.22-84.224 c6.229-6.229,16.4-6.229,22.597,0C359.714,134.265,359.809,144.404,353.517,150.665z"/>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
|
||||
<DrawingImage x:Key="SettingImage">
|
||||
<DrawingImage.Drawing>
|
||||
<DrawingGroup>
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="M496.158,248.085c0-137.021-111.07-248.082-248.076-248.082C111.07,0.003,0,111.063,0,248.085 c0,137.002,111.07,248.07,248.083,248.07C385.088,496.155,496.158,385.087,496.158,248.085z"/>
|
||||
<GeometryDrawing Brush="#FFFFFF" Geometry="M408.326,267.403v-38.649l-36.572-11.494c-3.107-12.406-8.03-24.09-14.476-34.756l17.779-34.071 l-27.332-27.33l-34.171,17.828c-10.621-6.372-22.247-11.236-34.588-14.309l-11.562-36.789h-38.652l-11.562,36.789 c-12.338,3.072-23.965,7.937-34.586,14.309l-34.172-17.828l-27.331,27.332l17.778,34.069c-6.444,10.666-11.367,22.35-14.472,34.756 l-36.575,11.494v38.649l36.431,11.451c3.078,12.524,7.997,24.32,14.468,35.084l-17.63,33.784l27.332,27.331l33.688-17.575 c10.803,6.546,22.659,11.523,35.251,14.636l11.379,36.211h38.652l11.38-36.211c12.593-3.112,24.448-8.09,35.254-14.636 l33.688,17.575l27.332-27.331l-17.628-33.784c6.47-10.764,11.389-22.56,14.466-35.084L408.326,267.403z M248.08,332.899 c-46.697,0-84.552-37.855-84.552-84.553c0-46.695,37.855-84.551,84.552-84.551c46.694,0,84.549,37.855,84.549,84.551 C332.629,295.044,294.774,332.899,248.08,332.899z"/>
|
||||
</DrawingGroup>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
<DrawingImage x:Key="ExpandImage">
|
||||
<DrawingImage.Drawing>
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="M225.923,354.706c-8.098,0-16.195-3.092-22.369-9.263L9.27,151.157c-12.359-12.359-12.359-32.397,0-44.751 c12.354-12.354,32.388-12.354,44.748,0l171.905,171.915l171.906-171.909c12.359-12.354,32.391-12.354,44.744,0 c12.365,12.354,12.365,32.392,0,44.751L248.292,345.449C242.115,351.621,234.018,354.706,225.923,354.706z"/>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
<DrawingImage x:Key="CollapseImage">
|
||||
<DrawingImage.Drawing>
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="M248.292,106.406l194.281,194.29c12.365,12.359,12.365,32.391,0,44.744c-12.354,12.354-32.391,12.354-44.744,0 L225.923,173.529L54.018,345.44c-12.36,12.354-32.395,12.354-44.748,0c-12.359-12.354-12.359-32.391,0-44.75L203.554,106.4 c6.18-6.174,14.271-9.259,22.369-9.259C234.018,97.141,242.115,100.232,248.292,106.406z"/>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
<DrawingImage x:Key="EyeImage">
|
||||
<DrawingImage.Drawing>
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="M244.425,98.725c-93.4,0-178.1,51.1-240.6,134.1c-5.1,6.8-5.1,16.3,0,23.1c62.5,83.1,147.2,134.2,240.6,134.2 s178.1-51.1,240.6-134.1c5.1-6.8,5.1-16.3,0-23.1C422.525,149.825,337.825,98.725,244.425,98.725z M251.125,347.025 c-62,3.9-113.2-47.2-109.3-109.3c3.2-51.2,44.7-92.7,95.9-95.9c62-3.9,113.2,47.2,109.3,109.3 C343.725,302.225,302.225,343.725,251.125,347.025z M248.025,299.625c-33.4,2.1-61-25.4-58.8-58.8c1.7-27.6,24.1-49.9,51.7-51.7 c33.4-2.1,61,25.4,58.8,58.8C297.925,275.625,275.525,297.925,248.025,299.625z"/>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
<DrawingImage x:Key="HiddenEyeImage">
|
||||
<DrawingImage.Drawing>
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="M191.2,248.6c0-15.3,5.7-28.7,17.2-40.2s24.9-17.2,40.2-17.2L191.2,248.6z M174,265.8c-1.9-5.7-1.9-11.5-1.9-17.2 c0-42.1,34.4-76.5,76.5-76.5c5.701,0,11.5,0,17.201,1.9l51.6-51.6c-21-5.7-44-7.7-68.9-7.7C76.5,114.7,0,248.6,0,248.6 s30.6,53.5,97.5,93.7L174,265.8z M306,248.6L248.6,306c15.3,0,28.701-5.7,40.201-17.2C300.199,277.3,306,263.899,306,248.6z M399.699,154.899l-76.5,76.5c1.9,5.7,1.9,11.5,1.9,17.2c0,42.1-34.4,76.5-76.5,76.5c-5.7,0-11.5,0-17.2-1.9L179.8,374.8 c21,5.7,44,7.6,68.8,7.6c172.099,0,248.599-133.9,248.599-133.9S466.6,195.1,399.699,154.899z M401.4,76.899l-324.5,324.5 l18.9,18.9L420.4,95.7L401.4,76.899z"/>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
<DrawingImage x:Key="TraceImage">
|
||||
<DrawingImage.Drawing>
|
||||
<DrawingGroup>
|
||||
<GeometryDrawing Brush="DarkGray" Geometry="M298.1,91.35c-1.6-2-4.4-2.8-7.2-1.6l-10.4,4l-32-70.8c-1.2-2.4-3.2-3.6-5.6-3.6h-104c-2,0-3.6,0.8-4.8,2.4l-58.8,70.4 c-1.2,1.2-1.6,3.2-1.2,4.8c0.4,1.6,1.2,3.2,2.4,4.4l58.8,43.6c2.8,2,6.8,1.6,8.8-1.2l38.4-52l18.4,32.8l-11.6,6 c-2.4,1.2-3.6,3.6-3.2,6c0.4,2.4,2,4.8,4.8,5.2l65.6,16c0.4,0,0.8,0,1.6,0c2,0,4-1.2,5.2-2.8l35.2-56.4 C300.1,96.15,299.7,93.35,298.1,91.35z M137.7,130.95l-48.4-36l52.8-63.2h8.4l26,48.4L137.7,130.95z M254.5,144.95l-44.4-10.8 l2.4-1.2c1.6-0.8,2.8-2,3.2-3.6c0.4-1.6,0.4-3.2-0.4-4.8l-26.4-47.2l-24.8-46h74.4l32.8,72.8c1.2,2.4,4,4,6.4,3.6L254.5,144.95z"/>
|
||||
<GeometryDrawing Brush="DarkGray" Geometry="M159.7,252.95l-64.8-2.8l16.8-33.6l11.2,6.4c2.4,1.2,5.2,1.2,7.2-0.8c2-1.6,2.8-4.4,1.6-6.8l-23.6-63.2 c-0.8-2.4-3.2-4-6-4l-66.8,2.4c-2.8,0-4.8,2-5.6,4.4c-0.8,2.4,0.4,5.2,2.4,6.8l9.2,6.4l-40.4,66.4c-1.2,2-1.2,4.8,0,6.8l44.8,66 l17.2,26c1.2,1.6,3.2,2.8,5.2,2.8h91.2c3.6,0,6.4-2.8,6.4-6.4v-70.4C165.7,256.15,162.9,253.35,159.7,252.95z M55.3,299.35 l-41.6-61.6l42-68c1.6-2.4,1.2-5.2-0.8-7.2l43.6-2l16,43.2l-2.4-1.2c-1.6-0.8-3.2-1.2-4.8-0.4c-1.6,0.4-2.8,1.6-3.6,3.2l-24,48 L55.3,299.35z M152.9,323.75H71.3l-8-12.4l25.6-48.8l64,2.8V323.75z"/>
|
||||
<GeometryDrawing Brush="DarkGray" Geometry="M371.7,232.15l-40-82.4c-0.8-1.6-2-2.8-3.6-3.2c-1.6-0.4-3.2-0.4-4.8,0.8l-64,35.6c-2.8,1.6-4,5.6-2.4,8.4l31.2,56.4 l-37.6,3.2l-0.4-12.8c0-2.8-2-4.8-4.4-5.6c-2.4-0.8-5.2,0-6.8,2l-41.6,53.2c-1.6,2-1.6,5.2-0.4,7.2l37.2,55.2 c1.2,1.6,3.2,2.8,5.2,2.8c0.4,0,1.2,0,1.6-0.4c2.4-0.8,4.4-3.2,4.4-5.6l0.4-11.2h77.6c2.4,0,4.8-1.6,5.6-3.6l42.8-94.8 C372.5,235.75,372.5,233.75,371.7,232.15z M320.1,323.75h-79.6c-2.8,0-5.2,2-6,4.4l-24.4-36.4l28.4-36.4v2.8c0,1.6,0.8,3.2,2,4.4 c1.2,1.2,2.8,1.6,4.8,1.6l53.6-4.8l52-3.6L320.1,323.75z M356.1,242.55l-54.8,4l-30.8-56l52.8-29.6l36.4,74L356.1,242.55z"/>
|
||||
</DrawingGroup>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
<DrawingImage x:Key="DebugImage">
|
||||
<DrawingImage.Drawing>
|
||||
<DrawingGroup>
|
||||
<GeometryDrawing Brush="Green" Geometry="M454.2,189.101l-33.6-5.7c-3.5-11.3-8-22.2-13.5-32.6l19.8-27.7c8.4-11.8,7.1-27.9-3.2-38.1l-29.8-29.8 c-5.6-5.6-13-8.7-20.9-8.7c-6.2,0-12.1,1.9-17.1,5.5l-27.8,19.8c-10.8-5.7-22.1-10.4-33.8-13.9l-5.6-33.2 c-2.4-14.3-14.7-24.7-29.2-24.7h-42.1c-14.5,0-26.8,10.4-29.2,24.7l-5.8,34c-11.2,3.5-22.1,8.1-32.5,13.7l-27.5-19.8 c-5-3.6-11-5.5-17.2-5.5c-7.9,0-15.4,3.1-20.9,8.7l-29.9,29.8c-10.2,10.2-11.6,26.3-3.2,38.1l20,28.1 c-5.5,10.5-9.9,21.4-13.3,32.7l-33.2,5.6c-14.3,2.4-24.7,14.7-24.7,29.2v42.1c0,14.5,10.4,26.8,24.7,29.2l34,5.8 c3.5,11.2,8.1,22.1,13.7,32.5l-19.7,27.4c-8.4,11.8-7.1,27.9,3.2,38.1l29.8,29.8c5.6,5.6,13,8.7,20.9,8.7c6.2,0,12.1-1.9,17.1-5.5 l28.1-20c10.1,5.3,20.7,9.6,31.6,13l5.6,33.6c2.4,14.3,14.7,24.7,29.2,24.7h42.2c14.5,0,26.8-10.4,29.2-24.7l5.7-33.6 c11.3-3.5,22.2-8,32.6-13.5l27.7,19.8c5,3.6,11,5.5,17.2,5.5l0,0c7.9,0,15.3-3.1,20.9-8.7l29.8-29.8c10.2-10.2,11.6-26.3,3.2-38.1 l-19.8-27.8c5.5-10.5,10.1-21.4,13.5-32.6l33.6-5.6c14.3-2.4,24.7-14.7,24.7-29.2v-42.1 C478.9,203.801,468.5,191.501,454.2,189.101z M451.9,260.401c0,1.3-0.9,2.4-2.2,2.6l-42,7c-5.3,0.9-9.5,4.8-10.8,9.9 c-3.8,14.7-9.6,28.8-17.4,41.9c-2.7,4.6-2.5,10.3,0.6,14.7l24.7,34.8c0.7,1,0.6,2.5-0.3,3.4l-29.8,29.8c-0.7,0.7-1.4,0.8-1.9,0.8 c-0.6,0-1.1-0.2-1.5-0.5l-34.7-24.7c-4.3-3.1-10.1-3.3-14.7-0.6c-13.1,7.8-27.2,13.6-41.9,17.4c-5.2,1.3-9.1,5.6-9.9,10.8l-7.1,42 c-0.2,1.3-1.3,2.2-2.6,2.2h-42.1c-1.3,0-2.4-0.9-2.6-2.2l-7-42c-0.9-5.3-4.8-9.5-9.9-10.8c-14.3-3.7-28.1-9.4-41-16.8 c-2.1-1.2-4.5-1.8-6.8-1.8c-2.7,0-5.5,0.8-7.8,2.5l-35,24.9c-0.5,0.3-1,0.5-1.5,0.5c-0.4,0-1.2-0.1-1.9-0.8l-29.8-29.8 c-0.9-0.9-1-2.3-0.3-3.4l24.6-34.5c3.1-4.4,3.3-10.2,0.6-14.8c-7.8-13-13.8-27.1-17.6-41.8c-1.4-5.1-5.6-9-10.8-9.9l-42.3-7.2 c-1.3-0.2-2.2-1.3-2.2-2.6v-42.1c0-1.3,0.9-2.4,2.2-2.6l41.7-7c5.3-0.9,9.6-4.8,10.9-10c3.7-14.7,9.4-28.9,17.1-42 c2.7-4.6,2.4-10.3-0.7-14.6l-24.9-35c-0.7-1-0.6-2.5,0.3-3.4l29.8-29.8c0.7-0.7,1.4-0.8,1.9-0.8c0.6,0,1.1,0.2,1.5,0.5l34.5,24.6 c4.4,3.1,10.2,3.3,14.8,0.6c13-7.8,27.1-13.8,41.8-17.6c5.1-1.4,9-5.6,9.9-10.8l7.2-42.3c0.2-1.3,1.3-2.2,2.6-2.2h42.1 c1.3,0,2.4,0.9,2.6,2.2l7,41.7c0.9,5.3,4.8,9.6,10,10.9c15.1,3.8,29.5,9.7,42.9,17.6c4.6,2.7,10.3,2.5,14.7-0.6l34.5-24.8 c0.5-0.3,1-0.5,1.5-0.5c0.4,0,1.2,0.1,1.9,0.8l29.8,29.8c0.9,0.9,1,2.3,0.3,3.4l-24.7,34.7c-3.1,4.3-3.3,10.1-0.6,14.7 c7.8,13.1,13.6,27.2,17.4,41.9c1.3,5.2,5.6,9.1,10.8,9.9l42,7.1c1.3,0.2,2.2,1.3,2.2,2.6v42.1H451.9z"/>
|
||||
<GeometryDrawing Brush="Green" Geometry="M239.4,136.001c-57,0-103.3,46.3-103.3,103.3s46.3,103.3,103.3,103.3s103.3-46.3,103.3-103.3S296.4,136.001,239.4,136.001 z M239.4,315.601c-42.1,0-76.3-34.2-76.3-76.3s34.2-76.3,76.3-76.3s76.3,34.2,76.3,76.3S281.5,315.601,239.4,315.601z"/>
|
||||
</DrawingGroup>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
<DrawingImage x:Key="InfoImage">
|
||||
<DrawingImage.Drawing>
|
||||
<GeometryDrawing Brush="#0072FF" Geometry="M256,0C114.613,0,0,114.617,0,256c0,141.391,114.613,256,256,256s256-114.609,256-256C512,114.617,397.387,0,256,0z M256,128c17.674,0,32,14.328,32,32c0,17.68-14.326,32-32,32s-32-14.32-32-32C224,142.328,238.326,128,256,128z M304,384h-96 c-8.836,0-16-7.156-16-16c0-8.836,7.164-16,16-16h16v-96h-16c-8.836,0-16-7.156-16-16c0-8.836,7.164-16,16-16h64 c8.836,0,16,7.164,16,16v112h16c8.836,0,16,7.164,16,16C320,376.844,312.836,384,304,384z"/>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
<DrawingImage x:Key="WarnImage">
|
||||
<DrawingImage.Drawing>
|
||||
<GeometryDrawing Brush="#EFCE4A" Geometry="M213.333,0C95.573,0,0,95.467,0,213.333s95.573,213.333,213.333,213.333S426.667,331.2,426.667,213.333 S331.093,0,213.333,0z M234.667,320H192v-42.667h42.667V320z M234.667,234.667H192v-128h42.667V234.667z"/>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
<DrawingImage x:Key="ErrorImage">
|
||||
<DrawingImage.Drawing>
|
||||
<DrawingGroup>
|
||||
<GeometryDrawing Brush="#D75A4A" Geometry="M496.158,248.085c0-137.021-111.07-248.082-248.076-248.082C111.07,0.003,0,111.063,0,248.085 c0,137.002,111.07,248.07,248.082,248.07C385.088,496.155,496.158,385.087,496.158,248.085z"/>
|
||||
<GeometryDrawing Brush="#FFFFFF" Geometry="M277.042,248.082l72.528-84.196c7.91-9.182,6.876-23.041-2.31-30.951 c-9.172-7.904-23.032-6.876-30.947,2.306l-68.236,79.212l-68.229-79.212c-7.91-9.188-21.771-10.216-30.954-2.306 c-9.186,7.91-10.214,21.77-2.304,30.951l72.522,84.196l-72.522,84.192c-7.91,9.182-6.882,23.041,2.304,30.951 c4.143,3.569,9.241,5.318,14.316,5.318c6.161,0,12.294-2.586,16.638-7.624l68.229-79.212l68.236,79.212 c4.338,5.041,10.47,7.624,16.637,7.624c5.069,0,10.168-1.749,14.311-5.318c9.186-7.91,10.22-21.77,2.31-30.951L277.042,248.082z"/>
|
||||
</DrawingGroup>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
<DrawingImage x:Key="FatalImage">
|
||||
<DrawingImage.Drawing>
|
||||
<DrawingGroup>
|
||||
<GeometryDrawing Brush="#E24C4B" Geometry="M227.556,0C102.4,0,0,102.4,0,227.556s102.4,227.556,227.556,227.556s227.556-102.4,227.556-227.556 S352.711,0,227.556,0z M227.556,412.444c-102.4,0-184.889-82.489-184.889-184.889S125.156,42.667,227.556,42.667 s184.889,82.489,184.889,184.889S329.956,412.444,227.556,412.444z"/>
|
||||
<GeometryDrawing Brush="#3F4448" Geometry="M183.467,183.467c5.689,7.111,5.689,22.756,5.689,22.756c0,15.644,18.489,24.178,41.244,24.178 s41.244-8.533,41.244-24.178c0,0,0-15.644,5.689-22.756l0,0l0,0c-4.267,1.422-5.689,1.422-8.533,1.422c0,0-9.956,1.422-15.644,7.111 c-2.844,2.844-7.111,4.267-11.378,4.267h-25.6c-4.267,0-8.533-1.422-11.378-4.267c-4.267-5.689-15.644-7.111-15.644-7.111 C187.733,184.889,186.311,184.889,183.467,183.467L183.467,183.467z"/>
|
||||
<GeometryDrawing Brush="#FFFFFF" Geometry="M230.4,230.4c-25.6,0-42.667-9.956-42.667-25.6c0,0,0-14.222-4.267-21.333l0,0 c0-1.422,0-1.422,0-2.844c0,0,1.422,0,2.844,0c1.422,1.422,4.267,1.422,5.689,1.422c0,0,11.378,1.422,17.067,8.533 c1.422,2.844,5.689,4.267,9.956,4.267h22.756c4.267,0,7.111-1.422,9.956-4.267c5.689-7.111,15.644-8.533,17.067-8.533 c2.844,0,4.267,0,7.111-1.422c0,0,1.422,0,2.844,0c1.422,0,1.422,1.422,0,2.844l0,0l0,0c-4.267,4.267-4.267,17.067-4.267,21.333 C273.067,220.444,256,230.4,230.4,230.4z M187.733,186.311c2.844,7.111,2.844,18.489,2.844,18.489 c0,15.644,21.333,21.333,38.4,21.333c18.489,0,38.4-5.689,38.4-21.333c0,0,0-11.378,2.844-18.489c-1.422,0-1.422,0-2.844,0 c0,0-8.533,1.422-14.222,5.689c-1.422,4.267-5.689,7.111-11.378,7.111h-25.6c-5.689,0-9.956-1.422-12.8-5.689 c-4.267-5.689-14.222-5.689-14.222-5.689C190.578,186.311,189.156,186.311,187.733,186.311z"/>
|
||||
<GeometryDrawing Brush="#FFFFFF" Geometry="M230.4,216.178c-24.178,0-28.444-8.533-28.444-15.644 c0-2.844,0-9.956-2.844-12.8c0,0,0,0,0-1.422c0-1.422,0-1.422,1.422-2.844h1.422c2.844,1.422,5.689,2.844,7.111,5.689 c1.422,2.844,5.689,4.267,9.956,4.267h22.756c4.267,0,7.111-1.422,9.956-4.267c1.422-2.844,4.267-4.267,7.111-5.689 c1.422,0,1.422,0,2.844,0c1.422,1.422,1.422,1.422,0,2.844c-2.844,2.844-2.844,9.956-2.844,12.8 C258.844,207.644,253.156,216.178,230.4,216.178z M204.8,193.422c1.422,4.267,1.422,7.111,1.422,8.533 c0,8.533,12.8,11.378,24.178,11.378c11.378,0,24.178-1.422,24.178-11.378c0,0,0-4.267,1.422-8.533l0,0 c-4.267,2.844-8.533,5.689-14.222,5.689h-25.6C211.911,199.111,207.644,196.267,204.8,193.422L204.8,193.422z"/>
|
||||
<GeometryDrawing Brush="#FFFFFF" Geometry="M230.4,216.178c-24.178,0-28.444-8.533-28.444-15.644 c0-2.844,0-9.956-2.844-12.8c0,0,0,0,0-1.422c0-1.422,0-1.422,1.422-2.844h1.422c2.844,1.422,5.689,2.844,7.111,5.689 c1.422,2.844,5.689,4.267,9.956,4.267h22.756c4.267,0,7.111-1.422,9.956-4.267c1.422-2.844,4.267-4.267,7.111-5.689 c1.422,0,1.422,0,2.844,0c1.422,1.422,1.422,1.422,0,2.844c-2.844,2.844-2.844,9.956-2.844,12.8 C258.844,207.644,253.156,216.178,230.4,216.178z M204.8,193.422c1.422,4.267,1.422,7.111,1.422,8.533 c0,8.533,12.8,11.378,24.178,11.378c11.378,0,24.178-1.422,24.178-11.378c0,0,0-4.267,1.422-8.533l0,0 c-4.267,2.844-8.533,5.689-14.222,5.689h-25.6C211.911,199.111,207.644,196.267,204.8,193.422L204.8,193.422z"/>
|
||||
<GeometryDrawing Brush="#3F4448" Geometry="M295.822,116.622c0,29.867-29.867,54.044-66.844,54.044s-66.844-24.178-66.844-54.044 S192,69.689,228.978,69.689C265.956,69.689,295.822,86.756,295.822,116.622z"/>
|
||||
<GeometryDrawing Brush="#3F4448" Geometry="M285.867,110.933L285.867,110.933c2.844,9.956,1.422,18.489-2.844,27.022 c-2.844,4.267-5.689,12.8-2.844,19.911c0,0,11.378,25.6-11.378,27.022c0,0-9.956,1.422-15.644,7.111 c-2.844,2.844-7.111,4.267-11.378,4.267h-25.6c-4.267,0-8.533-1.422-11.378-4.267c-4.267-5.689-15.644-7.111-15.644-7.111 c-21.333-1.422-11.378-27.022-11.378-27.022c2.844-8.533,0-15.644-2.844-19.911c-4.267-8.533-5.689-18.489-4.267-27.022l0,0"/>
|
||||
<GeometryDrawing Brush="#FFFFFF" Geometry="M241.778,199.111h-25.6c-5.689,0-9.956-1.422-12.8-5.689c-4.267-5.689-14.222-5.689-14.222-5.689 c-5.689,0-9.956-2.844-12.8-5.689c-5.689-8.533,0-21.333,0-22.756c2.844-7.111,0-14.222-2.844-18.489 c-4.267-8.533-5.689-18.489-4.267-28.444l0,0c0-1.422,1.422-1.422,2.844-1.422c1.422,0,1.422,1.422,1.422,2.844l0,0 c-1.422,8.533-1.422,17.067,2.844,25.6c2.844,5.689,5.689,14.222,2.844,22.756l0,0c0,0-5.689,12.8-1.422,19.911 c1.422,2.844,5.689,4.267,9.956,4.267c0,0,11.378,1.422,17.067,8.533c1.422,2.844,5.689,4.267,9.956,4.267H241.778 c4.267,0,7.111-1.422,9.956-4.267c5.689-7.111,15.644-8.533,17.067-8.533c4.267,0,8.533-1.422,9.956-4.267 c4.267-5.689,0-15.644-1.422-19.911l0,0c-2.844-8.533,0-17.067,2.844-22.756c4.267-7.111,5.689-17.067,2.844-25.6l0,0 c0-1.422,0-2.844,1.422-2.844c1.422,0,2.844,0,2.844,1.422l0,0c2.844,9.956,1.422,19.911-4.267,28.444 c-2.844,4.267-5.689,11.378-2.844,18.489c0,1.422,5.689,14.222,0,22.756c-2.844,4.267-7.111,5.689-12.8,5.689 c0,0-8.533,1.422-14.222,5.689C251.733,196.267,247.467,199.111,241.778,199.111z"/>
|
||||
<GeometryDrawing Brush="#FFFFFF" Geometry="M263.111,126.578c5.689,5.689,5.689,12.8,0,18.489c-5.689,5.689-12.8,5.689-18.489,0 c-5.689-5.689-9.956-18.489-4.267-22.756C244.622,118.044,257.422,122.311,263.111,126.578z"/>
|
||||
<GeometryDrawing Brush="#FFFFFF" Geometry="M196.267,126.578c-5.689,5.689-5.689,12.8,0,18.489c5.689,5.689,12.8,5.689,18.489,0 c5.689-5.689,9.956-18.489,4.267-22.756C213.333,118.044,200.533,122.311,196.267,126.578z"/>
|
||||
<GeometryDrawing Brush="#FFFFFF" Geometry="M228.978,152.178c-4.267,2.844-9.956,11.378-9.956,17.067c-1.422,5.689,1.422,9.956,7.111,9.956 c1.422,0,4.267-1.422,4.267-5.689v-21.333H228.978z"/>
|
||||
<GeometryDrawing Brush="#FFFFFF" Geometry="M231.822,152.178c4.267,2.844,9.956,11.378,9.956,17.067c1.422,5.689-1.422,9.956-7.111,9.956 c-1.422,0-4.267-1.422-4.267-5.689v-21.333H231.822z"/>
|
||||
<GeometryDrawing Brush="#FFFFFF" Geometry="M251.733,194.844v15.644c0,1.422-1.422,1.422-1.422,1.422c-1.422,0-1.422-1.422-1.422-1.422V204.8 c-1.422,0-1.422,1.422-2.844,1.422v7.111c0,1.422-1.422,1.422-1.422,1.422c-2.844,0-2.844,0-2.844-1.422v-5.689 c-1.422,0-2.844,0-4.267,0v5.689c0,1.422-1.422,1.422-1.422,1.422c-1.422,0-1.422-1.422-1.422-1.422v-5.689 c-1.422,0-1.422,0-2.844,0c-1.422,0-1.422,0-2.844,0v5.689c0,1.422-1.422,1.422-1.422,1.422c-1.422,0-1.422-1.422-1.422-1.422 v-5.689c-1.422,0-2.844,0-4.267,0v5.689c0,1.422-1.422,1.422-1.422,1.422c-1.422,0-1.422-1.422-1.422-1.422v-7.111 c-1.422,0-2.844,0-2.844-1.422v5.689c0,1.422-1.422,1.422-1.422,1.422c-1.422,0-1.422-1.422-1.422-1.422v-15.644 c0-1.422,1.422-1.422,1.422-1.422c1.422,0,1.422,1.422,1.422,1.422v5.689c1.422,0,1.422,1.422,2.844,1.422v-5.689 c0-1.422,1.422-1.422,1.422-1.422c1.422,0,1.422,1.422,1.422,1.422v5.689c1.422,0,2.844,0,4.267,0v-7.111 c0-1.422,1.422-1.422,1.422-1.422c1.422,0,1.422,1.422,1.422,1.422v7.111c1.422,0,1.422,0,2.844,0c1.422,0,1.422,0,2.844,0v-7.111 c0-1.422,1.422-1.422,1.422-1.422c1.422,0,1.422,1.422,1.422,1.422v7.111c1.422,0,2.844,0,4.267,0v-5.689 c0-1.422,1.422-1.422,1.422-1.422c1.422,0,1.422,1.422,1.422,1.422v5.689c1.422,0,2.844-1.422,2.844-1.422v-5.689 c0-1.422,1.422-1.422,1.422-1.422C251.733,193.422,251.733,193.422,251.733,194.844z"/>
|
||||
<GeometryDrawing Brush="#3F4448" Geometry="M318.578,342.756c-1.422,0-4.267,0-5.689-1.422c-7.111-2.844-11.378-11.378-8.533-19.911l1.422-4.267 l-78.222-31.289l-78.222,32.711l1.422,4.267c2.844,7.111,0,15.644-8.533,19.911c-1.422,1.422-4.267,1.422-5.689,1.422 c-5.689,0-11.378-4.267-14.222-9.956c-1.422-4.267-1.422-9.956,1.422-14.222l2.844-4.267l-5.689-2.844 c-4.267-1.422-8.533-4.267-11.378-8.533c-1.422-4.267-1.422-8.533,0-11.378c1.422-4.267,4.267-7.111,8.533-8.533 c1.422-1.422,4.267-1.422,5.689-1.422c5.689,0,11.378,2.844,14.222,8.533l1.422,4.267l55.467-22.756l-55.467-22.756l-1.422,4.267 c-2.844,5.689-8.533,8.533-14.222,8.533c-1.422,0-4.267,0-5.689-1.422c-4.267-1.422-7.111-4.267-8.533-8.533 c-1.422-4.267-1.422-8.533,0-11.378c1.422-4.267,5.689-8.533,11.378-8.533l5.689-1.422l-2.844-4.267 c-2.844-4.267-2.844-9.956-1.422-14.222c2.844-5.689,8.533-9.956,14.222-9.956c1.422,0,4.267,0,5.689,1.422 c7.111,2.844,11.378,11.378,8.533,19.911l-1.422,4.267l78.222,32.711l78.222-32.711l-1.422-4.267 c-2.844-7.111,1.422-15.644,8.533-19.911c1.422-1.422,4.267-1.422,5.689-1.422c5.689,0,11.378,4.267,14.222,9.956 c1.422,4.267,1.422,9.956-1.422,14.222l-2.844,4.267l5.689,1.422c4.267,1.422,8.533,4.267,11.378,8.533 c1.422,4.267,1.422,8.533,0,11.378c-1.422,4.267-4.267,7.111-8.533,8.533c-1.422,1.422-4.267,1.422-5.689,1.422 c-5.689,0-11.378-2.844-14.222-8.533l-1.422-4.267l-55.467,22.756l55.467,22.756l1.422-4.267c2.844-5.689,8.533-8.533,14.222-8.533 c1.422,0,4.267,0,5.689,1.422c4.267,1.422,7.111,4.267,8.533,8.533c1.422,4.267,1.422,8.533,0,11.378 c-1.422,4.267-5.689,8.533-11.378,8.533l-5.689,1.422l2.844,4.267c2.844,4.267,2.844,9.956,1.422,14.222 C329.956,338.489,324.267,342.756,318.578,342.756z"/>
|
||||
</DrawingGroup>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
<DrawingImage x:Key="CleanImage">
|
||||
<DrawingImage.Drawing>
|
||||
<DrawingGroup>
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="M662.688,13.546L491.347,345.754c0.983,0.276,1.964,0.569,2.938,0.883c7.235,2.33,14.028,5.17,20.353,8.499 c7.646,4.025,14.597,8.771,20.807,14.198L707.126,36.466c6.329-12.271,1.513-27.35-10.759-33.679 C684.095-3.543,669.018,1.274,662.688,13.546z"/>
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="M96.597,629.659c27.24,24.567,60.687,45.974,99.412,63.623c65.396,29.808,122.948,38.61,125.365,38.971 c0.067,0.01,0.135,0.019,0.201,0.028c0.763,0.104,1.53,0.156,2.299,0.156c0.186,0,0.371-0.003,0.557-0.009 c68.797-2.246,122.417-25.158,159.368-68.1c48.598-56.477,66.162-141.396,62.748-214.401 c-0.979-20.902-8.423-42.237-23.035-57.459c-1.089-1.134-2.208-2.242-3.376-3.306c-5.127-4.665-10.862-8.566-16.964-11.798 c-5.289-2.801-10.854-5.099-16.55-6.933c-2.365-0.762-4.732-1.338-7.096-1.762c-3.281-0.589-6.555-0.875-9.811-0.875 c-24.122,0-47.247,15.161-64.911,30.646c-18.24,15.992-36.755,33.421-57.363,47.073c-22.585,14.962-47.38,22.497-73.202,29.851 c-33.351,9.498-67.641,15.564-102.078,19.429c-30.618,3.435-61.647,5.433-92.587,5.433c-12.28,0-24.541-0.315-36.763-0.979 c-0.709-0.038-1.418-0.073-2.126-0.122c-0.394-0.027-0.789-0.041-1.181-0.041c-5.256,0-10.244,2.438-13.47,6.645 c-3.467,4.52-4.438,10.476-2.584,15.862C37.39,562.098,62,598.457,96.597,629.659z M72.798,534.07c0.01,0,0.02,0,0.031,0 c1.718,0.011,3.495,0.018,5.319,0.018c25.01,0,59.86-1.107,98.956-5.557c82.72-9.414,150.153-29.545,201.203-59.971 c1.45-0.864,3.079-1.296,4.711-1.296c1.541,0,3.083,0.384,4.479,1.151c29.672,16.308,75.781,40.474,108.659,52.206 c4.069,1.452,6.587,5.529,6.095,9.821c-3.927,34.31-15.064,77.974-44.329,111.89c-29.974,34.736-74.236,53.582-131.601,56.039 c-0.179,0.009-0.358,0.012-0.537,0.012c-0.744,0-1.485-0.066-2.22-0.195c-5.781-1.021-20.042-3.771-39.179-9.039 c5.455-2.409,11.098-5.297,16.801-8.518c5.106-2.885,10.256-6.028,15.354-9.318c15.771-10.173,31.043-21.723,42.925-31.227 c2.749-2.197,0.17-6.491-3.076-5.13c-25.975,10.898-59.161,18.186-88.854,22.977c-9.333,1.506-18.315,2.763-26.625,3.811 c-9.72,1.226-18.508,2.161-25.841,2.861c-1.911-0.843-3.827-1.699-5.75-2.581c-16.525-7.57-31.943-15.86-46.199-24.798 c6.222-0.576,12.76-1.608,19.391-2.957c6.024-1.226,12.117-2.71,18.114-4.339c17.659-4.796,34.451-10.852,45.937-15.312 c2.186-0.849,1.407-4.11-0.928-3.886c-20.907,2.012-49.906,2.197-74.67,1.833c-8.112-0.119-15.767-0.297-22.536-0.489 c-8.902-0.253-16.264-0.528-21.108-0.728c-2.841-2.377-5.625-4.782-8.326-7.227c-3.495-3.163-6.861-6.389-10.119-9.666 c5.027-0.51,10.246-1.31,15.546-2.324c4.956-0.949,9.976-2.083,14.969-3.344c19.719-4.976,38.959-11.876,51.687-16.817 c2.186-0.85,1.407-4.111-0.928-3.887c-19.628,1.89-46.387,2.168-70.079,1.894c-5.844-0.068-11.499-0.168-16.816-0.287 c-5.917-0.132-11.414-0.286-16.278-0.44c-6.884-9.15-12.967-18.648-18.219-28.478C67.136,537.741,69.365,534.07,72.798,534.07z"/>
|
||||
</DrawingGroup>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
<DrawingImage x:Key="CleanWhiteImage">
|
||||
<DrawingImage.Drawing>
|
||||
<DrawingGroup>
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="F1 M 25.3333,23.75L 50.6667,23.75C 51.5411,23.75 51.8541,27.3125 51.8541,27.3125L 24.1458,27.3125C 24.1458,27.3125 24.4589,23.75 25.3333,23.75 Z M 35.625,19.7917L 40.375,19.7917C 40.8122,19.7917 41.9583,20.9378 41.9583,21.375C 41.9583,21.8122 40.8122,22.9584 40.375,22.9584L 35.625,22.9584C 35.1878,22.9584 34.0416,21.8122 34.0416,21.375C 34.0416,20.9378 35.1878,19.7917 35.625,19.7917 Z M 27.7083,28.5L 48.2916,28.5C 49.1661,28.5 49.875,29.2089 49.875,30.0834L 48.2916,53.8334C 48.2916,54.7078 47.5828,55.4167 46.7083,55.4167L 29.2917,55.4167C 28.4172,55.4167 27.7083,54.7078 27.7083,53.8334L 26.125,30.0834C 26.125,29.2089 26.8339,28.5 27.7083,28.5 Z M 30.0833,31.6667L 30.4792,52.25L 33.25,52.25L 32.8542,31.6667L 30.0833,31.6667 Z M 36.4167,31.6667L 36.4167,52.25L 39.5833,52.25L 39.5833,31.6667L 36.4167,31.6667 Z M 43.1458,31.6667L 42.75,52.25L 45.5208,52.25L 45.9167,31.6667L 43.1458,31.6667 Z "/>
|
||||
</DrawingGroup>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
<DrawingImage x:Key="CleanWhiteTaskBarImage">
|
||||
<DrawingImage.Drawing>
|
||||
<DrawingGroup>
|
||||
<DrawingGroup>
|
||||
<GeometryDrawing Brush="White" Geometry="F1 M732.438,732.438z M0,0z M662.688,13.546L491.347,345.754C492.33,346.03 493.311,346.323 494.285,346.637 501.52,348.967 508.313,351.807 514.638,355.136 522.284,359.161 529.235,363.907 535.445,369.334L707.126,36.466C713.455,24.195 708.639,9.116 696.367,2.787 684.095,-3.543 669.018,1.274 662.688,13.546z" />
|
||||
<GeometryDrawing Brush="White" Geometry="F1 M732.438,732.438z M0,0z M96.597,629.659C123.837,654.226 157.284,675.633 196.009,693.282 261.405,723.09 318.957,731.892 321.374,732.253 321.441,732.263 321.509,732.272 321.575,732.281 322.338,732.385 323.105,732.437 323.874,732.437 324.06,732.437 324.245,732.434 324.431,732.428 393.228,730.182 446.848,707.27 483.799,664.328 532.397,607.851 549.961,522.932 546.547,449.927 545.568,429.025 538.124,407.69 523.512,392.468 522.423,391.334 521.304,390.226 520.136,389.162 515.009,384.497 509.274,380.596 503.172,377.364 497.883,374.563 492.318,372.265 486.622,370.431 484.257,369.669 481.89,369.093 479.526,368.669 476.245,368.08 472.971,367.794 469.715,367.794 445.593,367.794 422.468,382.955 404.804,398.44 386.564,414.432 368.049,431.861 347.441,445.513 324.856,460.475 300.061,468.01 274.239,475.364 240.888,484.862 206.598,490.928 172.161,494.793 141.543,498.228 110.514,500.226 79.5740000000001,500.226 67.2940000000001,500.226 55.0330000000001,499.911 42.8110000000001,499.247 42.1020000000001,499.209 41.3930000000001,499.174 40.6850000000001,499.125 40.2910000000001,499.098 39.8960000000001,499.084 39.5040000000001,499.084 34.2480000000001,499.084 29.2600000000001,501.522 26.0340000000001,505.729 22.5670000000001,510.249 21.5960000000001,516.205 23.4500000000001,521.591 37.3900000000001,562.098 62.0000000000001,598.457 96.5970000000001,629.659z" />
|
||||
</DrawingGroup>
|
||||
</DrawingGroup>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
<DrawingImage x:Key="MatchCaseImage">
|
||||
<DrawingImage.Drawing>
|
||||
<DrawingGroup>
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="M2.067,229.59l56.068-126.615c3.909-8.731,11.03-14.018,20.684-14.018h2.068 c9.648,0,16.544,5.286,20.449,14.018l56.07,126.615c1.149,2.528,1.84,4.825,1.84,7.124c0,9.421-7.354,17.004-16.776,17.004 c-8.272,0-13.788-4.825-17.004-12.18l-10.799-25.275H43.891l-11.26,26.426c-2.988,6.893-8.961,11.029-16.315,11.029 C7.121,253.718,0,246.365,0,237.173C0,234.645,0.918,232.118,2.067,229.59z M101.568,185.011l-22.291-53.082l-22.289,53.082 H101.568z"/>
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="M176.011,216.951v-0.46c0-26.885,20.452-39.294,49.635-39.294c12.41,0,21.373,2.068,30.105,5.056 v-2.068c0-14.478-8.963-22.519-26.427-22.519c-9.651,0-17.464,1.378-24.128,3.447c-2.067,0.689-3.447,0.918-5.058,0.918 c-8.04,0-14.474-6.204-14.474-14.246c0-6.205,3.905-11.49,9.419-13.559c11.03-4.136,22.981-6.434,39.296-6.434 c19.071,0,32.86,5.055,41.593,13.787c9.191,9.191,13.327,22.75,13.327,39.295v56.068c0,9.423-7.583,16.775-17.005,16.775 c-10.111,0-16.774-7.123-16.774-14.477v-0.23c-8.502,9.421-20.224,15.625-37.226,15.625 C195.083,254.637,176.011,241.311,176.011,216.951z M256.208,208.908v-6.204c-5.974-2.757-13.787-4.596-22.289-4.596 c-14.938,0-24.128,5.975-24.128,17.004v0.46c0,9.422,7.813,14.936,19.072,14.936C245.178,230.509,256.208,221.548,256.208,208.908 z"/>
|
||||
</DrawingGroup>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
<DrawingImage x:Key="MatchLogLevelImage">
|
||||
<DrawingImage.Drawing>
|
||||
<DrawingGroup>
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="M8,14c3.519,0,6.432-2.614,6.92-6H54c0.553,0,1-0.447,1-1s-0.447-1-1-1H14.92C14.432,2.614,11.519,0,8,0 C4.14,0,1,3.141,1,7S4.14,14,8,14z M8,2c2.757,0,5,2.243,5,5s-2.243,5-5,5S3,9.757,3,7S5.243,2,8,2z"/>
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="M48,42c-3.519,0-6.432,2.614-6.92,6H2c-0.552,0-1,0.447-1,1s0.448,1,1,1h39.08c0.488,3.386,3.401,6,6.92,6 c3.859,0,7-3.141,7-7S51.859,42,48,42z M48,54c-2.757,0-5-2.243-5-5s2.243-5,5-5s5,2.243,5,5S50.757,54,48,54z"/>
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="M54,27H35.368c-0.396-3.602-3.455-6.414-7.161-6.414c-3.706,0-6.765,2.813-7.161,6.414H2c-0.552,0-1,0.447-1,1s0.448,1,1,1 h19.109c0.577,3.4,3.536,6,7.098,6c3.562,0,6.52-2.6,7.097-6H54c0.553,0,1-0.447,1-1S54.553,27,54,27z M28.207,33 C25.336,33,23,30.664,23,27.793s2.336-5.207,5.207-5.207s5.207,2.336,5.207,5.207S31.078,33,28.207,33z"/>
|
||||
</DrawingGroup>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
<DrawingImage x:Key="SortDescImage">
|
||||
<DrawingImage.Drawing>
|
||||
<DrawingGroup>
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="M42.761,65.596H34.75V2c0-1.105-0.896-2-2-2H16.62c-1.104,0-2,0.895-2,2v63.596H6.609c-0.77,0-1.472,0.443-1.804,1.137 c-0.333,0.695-0.237,1.519,0.246,2.117l18.076,26.955c0.38,0.473,0.953,0.746,1.558,0.746s1.178-0.273,1.558-0.746L44.319,68.85 c0.482-0.6,0.578-1.422,0.246-2.117C44.233,66.039,43.531,65.596,42.761,65.596z"/>
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="M93.04,95.098L79.71,57.324c-0.282-0.799-1.038-1.334-1.887-1.334h-3.86c-0.107,0-0.213,0.008-0.318,0.024 c-0.104-0.018-0.21-0.024-0.318-0.024h-3.76c-0.849,0-1.604,0.535-1.887,1.336L54.403,95.1c-0.215,0.611-0.12,1.289,0.255,1.818 s0.983,0.844,1.633,0.844h5.773c0.88,0,1.657-0.574,1.913-1.416l2.536-8.324h14.419l2.536,8.324 c0.256,0.842,1.033,1.416,1.913,1.416h5.771c0.649,0,1.258-0.314,1.633-0.844C93.16,96.387,93.255,95.709,93.04,95.098z M68.905,80.066c2.398-7.77,4.021-13.166,4.82-16.041l4.928,16.041H68.905z"/>
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="M87.297,34.053H69.479L88.407,6.848c0.233-0.336,0.358-0.734,0.358-1.143V2.289c0-1.104-0.896-2-2-2H60.694 c-1.104,0-2,0.896-2,2v3.844c0,1.105,0.896,2,2,2h16.782L58.522,35.309c-0.233,0.336-0.358,0.734-0.358,1.146v3.441 c0,1.105,0.896,2,2,2h27.135c1.104,0,2-0.895,2-2v-3.842C89.297,34.947,88.402,34.053,87.297,34.053z"/>
|
||||
</DrawingGroup>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
<DrawingImage x:Key="SortImage">
|
||||
<DrawingImage.Drawing>
|
||||
<DrawingGroup>
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="M42.72,65.596h-8.011V2c0-1.105-0.896-2-2-2h-16.13c-1.104,0-2,0.895-2,2v63.596H6.568c-0.77,0-1.472,0.443-1.804,1.137 C4.432,67.428,4.528,68.25,5.01,68.85l18.076,26.955c0.38,0.473,0.953,0.746,1.558,0.746s1.178-0.273,1.558-0.746L44.278,68.85 c0.482-0.6,0.578-1.422,0.246-2.117C44.192,66.039,43.49,65.596,42.72,65.596z"/>
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="M92.998,39.315L79.668,1.541c-0.282-0.799-1.038-1.334-1.886-1.334h-3.861c-0.106,0-0.213,0.008-0.317,0.025 c-0.104-0.018-0.21-0.025-0.318-0.025h-3.76c-0.85,0-1.605,0.535-1.888,1.336L54.362,39.317c-0.215,0.611-0.12,1.289,0.255,1.818 c0.375,0.529,0.982,0.844,1.632,0.844h5.774c0.88,0,1.656-0.574,1.913-1.416l2.535-8.324H80.89l2.536,8.324 c0.256,0.842,1.033,1.416,1.913,1.416h5.771c0.648,0,1.258-0.314,1.633-0.844C93.119,40.604,93.213,39.926,92.998,39.315z M68.864,24.283c2.397-7.77,4.02-13.166,4.82-16.041l4.928,16.041H68.864z"/>
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="M87.255,89.838H69.438l18.928-27.205c0.232-0.336,0.357-0.734,0.357-1.143v-3.416c0-1.104-0.896-2-2-2h-26.07 c-1.104,0-2,0.896-2,2v3.844c0,1.105,0.896,2,2,2h16.782L58.481,91.094c-0.234,0.336-0.359,0.734-0.359,1.145v3.441 c0,1.105,0.896,2,2,2h27.135c1.104,0,2-0.895,2-2v-3.842C89.255,90.732,88.361,89.838,87.255,89.838z"/>
|
||||
</DrawingGroup>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
<DrawingImage x:Key="StopImage">
|
||||
<DrawingImage.Drawing>
|
||||
<DrawingGroup ClipGeometry="M0,0 V504 H504 V0 H0 Z">
|
||||
<GeometryDrawing Brush="#FFDF5C4E" Geometry="F1 M504,504z M0,0z M151.8,500L151.8,500 9.8,353.6 9.8,148.4 151.8,4 357.4,4 501.8,148.4 501.8,353.6 357.4,500z" />
|
||||
<GeometryDrawing Brush="#FFF4EFEF" Geometry="F1 M504,504z M0,0z M282.6,251.2L373,160.8C377.4,156.4,377.4,148.8,373,144.4L361.8,133.2C357.4,128.8,349.8,128.8,345.4,133.2L255,223.6 164.6,133.2C160.2,128.8,152.6,128.8,148.2,133.2L137,144.4C132.6,148.8,132.6,156.4,137,160.8L227.4,251.2 137,341.6C132.6,346,132.6,353.6,137,358L148.2,369.2C152.6,373.6,160.2,373.6,164.6,369.2L255,278.8 345.4,369.2C349.8,373.6,357.4,373.6,361.8,369.2L373,358C377.4,353.6,377.4,346,373,341.6L282.6,251.2z" />
|
||||
<GeometryDrawing Brush="#FF000000" Geometry="F1 M504,504z M0,0z M357.4,504L152.2,504C151,504,150.2,503.6,149.4,502.8L3.4,356.4C2.6,355.6,2.2,354.8,2.2,353.6L2.2,148.4C2.2,147.2,2.6,146.4,3.4,145.6L149.4,1.19999999999999C150.2,0.399999999999989,151,-1.13242748511766E-14,152.2,-1.13242748511766E-14L357.4,-1.13242748511766E-14C358.6,-1.13242748511766E-14,359.4,0.399999999999989,360.2,1.19999999999999L500.6,145.6C501.4,146.4,501.8,147.2,501.8,148.4L501.8,353.6C501.8,354.8,501.4,355.6,500.6,356.4L360.2,502.8C359.4,503.6,358.2,504,357.4,504z M153.8,496L355.8,496 494.2,352 494.2,150 356.2,8 153.8,8 9.8,150 9.8,352 153.8,496z" />
|
||||
<GeometryDrawing Brush="#FF000000" Geometry="F1 M504,504z M0,0z M155.8,376.8C151.8,376.8,147.8,375.2,144.6,372.4L133.4,361.2C127.4,355.2,127.4,345.2,133.4,339.2L221,251.6 133.4,164C127.4,158,127.4,148,133.4,142L144.6,130.8C150.6,124.8,160.6,124.8,166.6,130.8L254.2,218.4 341.8,130.8C344.6,128 348.6,126.4 353,126.4 357.4,126.4 361,128 364.2,130.8L375.4,142C381.4,148,381.4,158,375.4,164L287.8,251.6 375.4,339.2C381.4,345.2,381.4,355.2,375.4,361.2L364.2,372.4C361.4,375.2,357.4,376.8,353,376.8L353,376.8C349,376.8,345,375.2,341.8,372.4L254.2,284.8 166.6,372.4C163.8,375.2,159.8,376.8,155.8,376.8z M155.8,133.2C153.8,133.2,151.8,134,150.6,135.6L139.4,146.8C136.6,149.6,136.6,154.8,139.4,157.6L229.8,248C230.6,248.8 231,249.6 231,250.8 231,252 230.6,252.8 229.8,253.6L139.4,344C136.6,346.8,136.6,352,139.4,354.8L150.6,366C153.4,368.8,158.6,368.8,161.4,366L251.8,275.6C253.4,274,255.8,274,257.4,275.6L347.8,366C349.4,367.6,351,368.4,353,368.4L353,368.4C355,368.4,357,367.6,358.2,366L369.4,354.8C372.2,352,372.2,346.8,369.4,344L279,253.6C278.2,252.8 277.8,252 277.8,250.8 277.8,249.6 278.2,248.8 279,248L369.4,157.6C372.2,154.8,372.2,149.6,369.4,146.8L358.2,135.6C355.4,132.8,350.2,132.8,347.4,135.6L257,226C255.4,227.6,253,227.6,251.4,226L161,135.6C159.8,134,157.8,133.2,155.8,133.2z" />
|
||||
</DrawingGroup>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
<DrawingImage x:Key="CancelDrawingImage">
|
||||
<DrawingImage.Drawing>
|
||||
<DrawingGroup ClipGeometry="M0,0 V51.976 H51.976 V0 H0 Z">
|
||||
<DrawingGroup>
|
||||
<GeometryDrawing Brush="Gray" Geometry="F1 M51.976,51.976z M0,0z M44.373,7.603C34.236,-2.534 17.741,-2.535 7.60299999999999,7.603 -2.53500000000001,17.741 -2.53400000000001,34.235 7.60299999999999,44.373 17.74,54.511 34.235,54.511 44.373,44.373 54.51,34.235 54.51,17.74 44.373,7.603z M36.241,36.241C35.46,37.022,34.194,37.022,33.413,36.241L25.988,28.816 18.21,36.594C17.429,37.375 16.163,37.375 15.382,36.594 14.601,35.813 14.601,34.547 15.382,33.766L23.16,25.988 15.735,18.563C14.954,17.782 14.954,16.515 15.735,15.735 16.516,14.954 17.782,14.954 18.563,15.735L25.988,23.16 33.059,16.089C33.84,15.308 35.106,15.308 35.887,16.089 36.668,16.87 36.668,18.136 35.887,18.917L28.816,25.988 36.241,33.413C37.022,34.194,37.022,35.46,36.241,36.241z" />
|
||||
</DrawingGroup>
|
||||
</DrawingGroup>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
<DrawingImage x:Key="IgnoreIPStopImage">
|
||||
<DrawingImage.Drawing>
|
||||
<DrawingGroup ClipGeometry="M0,0 V504 H504 V0 H0 Z">
|
||||
<GeometryDrawing Brush="#FF000000" Geometry="F1 M504,504z M0,0z M151.8,500L151.8,500 9.8,353.6 9.8,148.4 151.8,4 357.4,4 501.8,148.4 501.8,353.6 357.4,500z" />
|
||||
<GeometryDrawing Brush="#FFDF5C4E" Geometry="F1 M504,504z M0,0z M282.6,251.2L373,160.8C377.4,156.4,377.4,148.8,373,144.4L361.8,133.2C357.4,128.8,349.8,128.8,345.4,133.2L255,223.6 164.6,133.2C160.2,128.8,152.6,128.8,148.2,133.2L137,144.4C132.6,148.8,132.6,156.4,137,160.8L227.4,251.2 137,341.6C132.6,346,132.6,353.6,137,358L148.2,369.2C152.6,373.6,160.2,373.6,164.6,369.2L255,278.8 345.4,369.2C349.8,373.6,357.4,373.6,361.8,369.2L373,358C377.4,353.6,377.4,346,373,341.6L282.6,251.2z" />
|
||||
<GeometryDrawing Brush="#FFF4EFEF" Geometry="F1 M504,504z M0,0z M357.4,504L152.2,504C151,504,150.2,503.6,149.4,502.8L3.4,356.4C2.6,355.6,2.2,354.8,2.2,353.6L2.2,148.4C2.2,147.2,2.6,146.4,3.4,145.6L149.4,1.19999999999999C150.2,0.399999999999989,151,-1.13242748511766E-14,152.2,-1.13242748511766E-14L357.4,-1.13242748511766E-14C358.6,-1.13242748511766E-14,359.4,0.399999999999989,360.2,1.19999999999999L500.6,145.6C501.4,146.4,501.8,147.2,501.8,148.4L501.8,353.6C501.8,354.8,501.4,355.6,500.6,356.4L360.2,502.8C359.4,503.6,358.2,504,357.4,504z M153.8,496L355.8,496 494.2,352 494.2,150 356.2,8 153.8,8 9.8,150 9.8,352 153.8,496z" />
|
||||
<GeometryDrawing Brush="#FFF4EFEF" Geometry="F1 M504,504z M0,0z M155.8,376.8C151.8,376.8,147.8,375.2,144.6,372.4L133.4,361.2C127.4,355.2,127.4,345.2,133.4,339.2L221,251.6 133.4,164C127.4,158,127.4,148,133.4,142L144.6,130.8C150.6,124.8,160.6,124.8,166.6,130.8L254.2,218.4 341.8,130.8C344.6,128 348.6,126.4 353,126.4 357.4,126.4 361,128 364.2,130.8L375.4,142C381.4,148,381.4,158,375.4,164L287.8,251.6 375.4,339.2C381.4,345.2,381.4,355.2,375.4,361.2L364.2,372.4C361.4,375.2,357.4,376.8,353,376.8L353,376.8C349,376.8,345,375.2,341.8,372.4L254.2,284.8 166.6,372.4C163.8,375.2,159.8,376.8,155.8,376.8z M155.8,133.2C153.8,133.2,151.8,134,150.6,135.6L139.4,146.8C136.6,149.6,136.6,154.8,139.4,157.6L229.8,248C230.6,248.8 231,249.6 231,250.8 231,252 230.6,252.8 229.8,253.6L139.4,344C136.6,346.8,136.6,352,139.4,354.8L150.6,366C153.4,368.8,158.6,368.8,161.4,366L251.8,275.6C253.4,274,255.8,274,257.4,275.6L347.8,366C349.4,367.6,351,368.4,353,368.4L353,368.4C355,368.4,357,367.6,358.2,366L369.4,354.8C372.2,352,372.2,346.8,369.4,344L279,253.6C278.2,252.8 277.8,252 277.8,250.8 277.8,249.6 278.2,248.8 279,248L369.4,157.6C372.2,154.8,372.2,149.6,369.4,146.8L358.2,135.6C355.4,132.8,350.2,132.8,347.4,135.6L257,226C255.4,227.6,253,227.6,251.4,226L161,135.6C159.8,134,157.8,133.2,155.8,133.2z" />
|
||||
</DrawingGroup>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
<DrawingImage x:Key="TreeImage">
|
||||
<DrawingImage.Drawing>
|
||||
<DrawingGroup ClipGeometry="M0,0 V16 H16 V0 H0 Z">
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="F1 M16,16z M0,0z M16,10L16,6 5,6 5,7 3,7 3,4 12,4 12,0 0,0 0,4 2,4 2,14 5,14 5,16 16,16 16,12 5,12 5,13 3,13 3,8 5,8 5,10z" />
|
||||
</DrawingGroup>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
<DrawingImage x:Key="ReturnBackImage">
|
||||
<DrawingImage.Drawing>
|
||||
<DrawingGroup ClipGeometry="M0,0 V512 H512 V0 H0 Z">
|
||||
<DrawingGroup>
|
||||
<GeometryDrawing Brush="{Binding Path=SelectedColorTheme.Color}" Geometry="F1 M512,512z M0,0z M256,7.5L256,504.5C393.243,504.5 504.5,393.243 504.5,256 504.5,118.757 393.243,7.5 256,7.5z" />
|
||||
<GeometryDrawing Brush="{Binding Path=SelectedColorTheme.Color}" Geometry="F1 M512,512z M0,0z M464.5,256C464.5,118.757 371.151,7.5 256,7.5 118.757,7.5 7.5,118.757 7.5,256 7.5,393.243 118.757,504.5 256,504.5 371.151,504.5 464.5,393.243 464.5,256z" />
|
||||
<GeometryDrawing Brush="#FFFFFFFF" Geometry="F1 M512,512z M0,0z M271.001,97.5L354.5,161 374.5,241C374.5,298.161,328.162,344.499,271.001,344.5L271.001,384.5C350.253,384.499 414.5,320.253 414.5,241 414.5,161.747 350.253,97.501 271.001,97.5z" />
|
||||
<GeometryDrawing Brush="#FFFFFFFF" Geometry="F1 M512,512z M0,0z M384.5,241C384.5,161.747 333.685,97.501 271.001,97.5 271,97.5 256,97.5 256,97.5L256,127.5 271,127.5C308.832,127.5 339.5,158.168 339.5,196 339.5,233.831 308.832,264.5 271,264.5L187.5,264.5 187.5,234.5 97.5,324.5 187.5,414.5 187.5,384.5 271.001,384.5C333.685,384.499,384.5,320.253,384.5,241z" />
|
||||
<GeometryDrawing Brush="#FF000000" Geometry="F1 M512,512z M0,0z M437.02,74.98C388.668,26.629 324.38,0 256,0 187.62,0 123.332,26.629 74.98,74.98 26.628,123.331 0,187.62 0,256 0,324.38 26.629,388.668 74.98,437.02 123.331,485.372 187.62,512 256,512 324.38,512 388.668,485.371 437.02,437.02 485.372,388.669 512,324.38 512,256 512,187.62 485.371,123.332 437.02,74.98z M256,497C123.112,497 15,388.888 15,256 15,123.112 123.112,15 256,15 388.888,15 497,123.112 497,256 497,388.888 388.888,497 256,497z" />
|
||||
<GeometryDrawing Brush="#FF000000" Geometry="F1 M512,512z M0,0z M271,90L256,90C251.857,90,248.5,93.357,248.5,97.5L248.5,127.5C248.5,131.643,251.857,135,256,135L271,135C304.636,135 332,162.364 332,196 332,229.636 304.636,257 271,257L247.5,257C243.357,257 240,260.357 240,264.5 240,268.643 243.357,272 247.5,272L271,272C312.906,272 347,237.906 347,196 347,154.094 312.906,120 271,120L263.5,120 263.5,105 271,105C345.99,105 407,166.01 407,241 407,315.99 345.99,377 271,377L187.5,377C183.357,377,180,380.357,180,384.5L180,396.394 108.106,324.5 180,252.606 180,264.5C180,268.643,183.357,272,187.5,272L217.5,272C221.643,272 225,268.643 225,264.5 225,260.357 221.643,257 217.5,257L195,257 195,234.5C195,231.467 193.173,228.731 190.37,227.571 187.567,226.408 184.342,227.051 182.196,229.196L92.196,319.196C89.267,322.126,89.267,326.874,92.196,329.803L182.196,419.803C183.632,421.238 185.55,421.999 187.502,421.999 188.468,421.999 189.442,421.812 190.37,421.428 193.173,420.268 195,417.532 195,414.499L195,392 271,392C354.262,392 422,324.262 422,241 422,157.738 354.262,90 271,90z" />
|
||||
</DrawingGroup>
|
||||
</DrawingGroup>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
<DrawingImage x:Key="FindNextError">
|
||||
<DrawingImage.Drawing>
|
||||
<DrawingGroup ClipGeometry="M0,0 V481 H481.83088 V0 H0 Z">
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="F1 M481.83088,481z M0,0z M322.097656,322.359375C314.519531,329.933594,306.300781,336.839844,297.535156,343L428.65625,474.121094 473.855469,428.917969 342.738281,297.800781C336.574219,306.5625,329.667969,314.78125,322.097656,322.359375z M322.097656,322.359375" />
|
||||
<DrawingGroup>
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="F1 M481.83088,481z M0,0z M480.51172,424.23828L353.92969,297.67969C398.46094,228.97266 394.49219,139.57812 344.04688,75.08594 293.60547,10.59375 207.79688,-14.78906 130.38672,11.88281 52.97656,38.55469 1.01563,111.40234 1,193.28125 0.82813,263.71875 39.30469,328.57812 101.21094,362.1875 163.11719,395.79688 238.46875,392.73828 297.44922,354.22266L423.97656,480.77734C427.10156,483.89844,432.16406,483.89844,435.28906,480.77734L480.48828,435.57422C483.61328,432.45312,483.61328,427.38672,480.48828,424.26562L480.51172,424.23828z M68.58594,317.69531C2.65625,251.77734 -0.42969,145.88281 61.54688,76.23828 123.52344,6.58984 229.05859,-2.64453 302.1875,55.17969 375.32031,113.00391 390.67188,217.82422 337.19141,294.19141 325.38672,311.01172 310.74609,325.64844 293.92969,337.45703 224.01953,386.60547 128.87109,378.26172 68.58594,317.69531z M429.65625,463.80859L310.75391,344.90234C312.03906,343.90234 313.25781,342.81641 314.51953,341.78516 315.60156,340.89453 316.67969,340.01563 317.71875,339.10547 321.51172,335.85547 325.22266,332.51953 328.73047,329.01563 332.23438,325.51172 335.57031,321.81641 338.81641,318.00781 339.73047,316.94531 340.60938,315.86328 341.49609,314.80859 342.52734,313.54297 343.61719,312.32813 344.61719,311.03906L463.54297,429.91797 429.65625,463.80859z M429.65625,463.80859" />
|
||||
<DrawingGroup>
|
||||
<GlyphRunDrawing ForegroundBrush="{Binding Path=IconColor}">
|
||||
<GlyphRunDrawing.GlyphRun>
|
||||
<GlyphRun PixelsPerDip="1" BaselineOrigin="119.415466308594,270.9375" FontRenderingEmSize="250" BidiLevel="0" IsSideways="False" ClusterMap="0" Characters="E" GlyphIndices="40" AdvanceWidths="126.463333333333" GlyphOffsets="0,0" Language="en-us">
|
||||
<GlyphRun.GlyphTypeface>
|
||||
<GlyphTypeface FontUri="C:\WINDOWS\FONTS\SEGOEUI.TTF" StyleSimulations="None" />
|
||||
</GlyphRun.GlyphTypeface>
|
||||
</GlyphRun>
|
||||
</GlyphRunDrawing.GlyphRun>
|
||||
</GlyphRunDrawing>
|
||||
</DrawingGroup>
|
||||
</DrawingGroup>
|
||||
</DrawingGroup>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
<DrawingImage x:Key="FindNextWarning">
|
||||
<DrawingImage.Drawing>
|
||||
<DrawingGroup ClipGeometry="M0,0 V481 H481.83088 V0 H0 Z">
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="F1 M481.83088,481z M0,0z M297.535156,343L428.65625,474.121094 473.855469,428.917969 342.738281,297.800781C330.398438,315.367188,315.101562,330.660156,297.535156,343z M297.535156,343" />
|
||||
<DrawingGroup>
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="F1 M481.83088,481z M0,0z M479.511719,423.238281L352.929688,296.679688C397.460938,227.972656 393.492188,138.578125 343.046875,74.0859379999999 292.605469,9.59374999999994 206.796875,-15.7890620000001 129.386719,10.8828119999999 51.9765620000001,37.5546879999999 0.0156250000000568,110.402344 5.6843418860808E-14,192.28125 -0.171874999999943,262.71875 38.3046880000001,327.578125 100.210938,361.1875 162.117188,394.796875 237.46875,391.738281 296.449219,353.222656L422.976562,479.777344C426.101562,482.898438,431.164062,482.898438,434.289062,479.777344L479.488281,434.574219C482.613281,431.453125,482.613281,426.386719,479.488281,423.265625z M67.5859380000001,316.695312C1.65625000000006,250.777344 -1.42968799999994,144.882812 60.5468750000001,75.2382809999999 122.523438,5.58984399999994 228.058594,-3.64453100000006 301.1875,54.1796879999999 374.320312,112.003906 389.671875,216.824219 336.191406,293.191406 324.386719,310.011719 309.746094,324.648438 292.929688,336.457031 223.019531,385.609375 127.871094,377.265625 67.5859380000001,316.695312z M428.65625,462.808594L309.753906,343.902344C311.039062,342.902344 312.257812,341.816406 313.519531,340.785156 314.601562,339.894531 315.679688,339.015625 316.71875,338.105469 320.511719,334.855469 324.222656,331.519531 327.730469,328.015625 331.234375,324.511719 334.570312,320.816406 337.816406,317.007812 338.730469,315.945312 339.609375,314.863281 340.496094,313.808594 341.527344,312.542969 342.617188,311.328125 343.617188,310.039062L462.542969,428.917969z M428.65625,462.808594" />
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="F1 M481.83088,481z M0,0z M240.578125,288.839844C237.082031,288.839844,233.992188,286.574219,232.945312,283.238281L192.578125,155.40625 152.207031,283.238281C151.199219,286.707031 147.941406,289.023438 144.335938,288.839844 140.757812,288.730469 137.683594,286.257812 136.816406,282.785156L96.816406,122.785156C96.097656,120.003906 96.925781,117.050781 98.984375,115.050781 101.042969,113.046875 104.019531,112.300781 106.777344,113.097656 109.535156,113.890625 111.660156,116.105469 112.335938,118.894531L145.472656,251.441406 184.945312,126.441406C185.992188,123.105469 189.082031,120.839844 192.578125,120.839844 196.070312,120.839844 199.160156,123.105469 200.207031,126.441406L239.679688,251.449219 272.816406,118.894531C273.914062,114.640625 278.242188,112.066406 282.507812,113.136719 286.769531,114.203125 289.375,118.511719 288.335938,122.785156L248.335938,282.785156C247.46875,286.257812,244.394531,288.730469,240.816406,288.839844z M240.578125,288.839844" />
|
||||
</DrawingGroup>
|
||||
</DrawingGroup>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
<DrawingImage x:Key="ExportDrawingImage">
|
||||
<DrawingImage.Drawing>
|
||||
<DrawingGroup ClipGeometry="M0,0 V502 H502 V0 H0 Z">
|
||||
<DrawingGroup>
|
||||
<DrawingGroup>
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="F1 M502,502z M0,0z M491.951,414.346L425.581,347.976C418.61,341.006 408.221,338.94 399.113,342.712 390.005,346.484 384.12,355.292 384.12,365.15L384.12,375.13C384.12,377.494,382.197,379.417,379.833,379.417L373.12,379.417 373.12,103C373.12,100.348,372.066,97.804,370.191,95.929L277.191,2.929C275.316,1.054,272.772,0,270.12,0L17.12,0C11.597,0,7.12,4.477,7.12,10L7.12,492C7.12,497.523,11.597,502,17.12,502L363.12,502C368.643,502,373.12,497.523,373.12,492L373.12,463.417 379.833,463.417C382.197,463.417,384.12,465.34,384.12,467.704L384.12,477.684C384.12,487.542 390.005,496.35 399.113,500.122 402.136,501.374 405.299,501.983 408.432,501.983 414.74,501.983 420.924,499.514 425.581,494.858L491.951,428.488C493.826,426.613 494.88,424.069 494.88,421.417 494.88,418.765 493.826,416.221 491.951,414.346z M280.12,34.142L338.978,93 280.12,93 280.12,34.142z M353.12,482L27.12,482 27.12,20 260.12,20 260.12,103C260.12,108.523,264.597,113,270.12,113L353.12,113 353.12,379.417 332.12,379.417C326.597,379.417,322.12,383.894,322.12,389.417L322.12,453.417C322.12,458.94,326.597,463.417,332.12,463.417L353.12,463.417 353.12,482z M411.438,480.716C409.676,482.479 407.755,482.054 406.766,481.645 405.778,481.235 404.12,480.177 404.12,477.684L404.12,467.704C404.12,454.312,393.225,443.417,379.833,443.417L342.12,443.417 342.12,399.417 379.833,399.417C393.225,399.417,404.12,388.522,404.12,375.13L404.12,365.15C404.12,362.658 405.778,361.599 406.766,361.19 407.754,360.78 409.676,360.356 411.438,362.119L470.737,421.417 411.438,480.716z" />
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="F1 M502,502z M0,0z M77.62,174L243.12,174C248.643,174 253.12,169.523 253.12,164 253.12,158.477 248.643,154 243.12,154L77.62,154C72.097,154 67.62,158.477 67.62,164 67.62,169.523 72.097,174 77.62,174z" />
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="F1 M502,502z M0,0z M302.62,220L77.62,220C72.097,220 67.62,224.477 67.62,230 67.62,235.523 72.097,240 77.62,240L302.62,240C308.143,240 312.62,235.523 312.62,230 312.62,224.477 308.143,220 302.62,220z" />
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="F1 M502,502z M0,0z M302.62,286L77.62,286C72.097,286 67.62,290.477 67.62,296 67.62,301.523 72.097,306 77.62,306L302.62,306C308.143,306 312.62,301.523 312.62,296 312.62,290.477 308.143,286 302.62,286z" />
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="F1 M502,502z M0,0z M302.62,352L77.62,352C72.097,352 67.62,356.477 67.62,362 67.62,367.523 72.097,372 77.62,372L302.62,372C308.143,372 312.62,367.523 312.62,362 312.62,356.477 308.143,352 302.62,352z" />
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="F1 M502,502z M0,0z M302.62,154L280.62,154C275.097,154 270.62,158.477 270.62,164 270.62,169.523 275.097,174 280.62,174L302.62,174C308.143,174 312.62,169.523 312.62,164 312.62,158.477 308.143,154 302.62,154z" />
|
||||
</DrawingGroup>
|
||||
</DrawingGroup>
|
||||
</DrawingGroup>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
<DrawingImage x:Key="ImportDrawingImage">
|
||||
<DrawingImage.Drawing>
|
||||
<DrawingGroup ClipGeometry="M0,0 V502 H502 V0 H0 Z">
|
||||
<DrawingGroup>
|
||||
<DrawingGroup>
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="F1 M502,502z M0,0z M81.5,174L247,174C252.523,174 257,169.523 257,164 257,158.477 252.523,154 247,154L81.5,154C75.977,154 71.5,158.477 71.5,164 71.5,169.523 75.977,174 81.5,174z" />
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="F1 M502,502z M0,0z M306.5,220L81.5,220C75.977,220 71.5,224.477 71.5,230 71.5,235.523 75.977,240 81.5,240L306.5,240C312.023,240 316.5,235.523 316.5,230 316.5,224.477 312.023,220 306.5,220z" />
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="F1 M502,502z M0,0z M306.5,286L81.5,286C75.977,286 71.5,290.477 71.5,296 71.5,301.523 75.977,306 81.5,306L306.5,306C312.023,306 316.5,301.523 316.5,296 316.5,290.477 312.023,286 306.5,286z" />
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="F1 M502,502z M0,0z M306.5,352L81.5,352C75.977,352 71.5,356.477 71.5,362 71.5,367.523 75.977,372 81.5,372L306.5,372C312.023,372 316.5,367.523 316.5,362 316.5,356.477 312.023,352 306.5,352z" />
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="F1 M502,502z M0,0z M306.5,154L284.5,154C278.977,154 274.5,158.477 274.5,164 274.5,169.523 278.977,174 284.5,174L306.5,174C312.023,174 316.5,169.523 316.5,164 316.5,158.477 312.023,154 306.5,154z" />
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="F1 M502,502z M0,0z M481,379.417L433.287,379.417C430.923,379.417,429,377.494,429,375.13L429,365.15C429,355.292 423.115,346.484 414.007,342.712 404.899,338.94 394.51,341.006 387.539,347.977L377,358.516 377,103C377,100.348,375.946,97.804,374.071,95.929L281.071,2.929C279.196,1.054,276.652,0,274,0L21,0C15.477,0,11,4.477,11,10L11,492C11,497.523,15.477,502,21,502L367,502C372.523,502,377,497.523,377,492L377,484.319 387.539,494.858C392.197,499.515 398.38,501.983 404.688,501.983 407.821,501.983 410.985,501.374 414.007,500.122 423.114,496.35 429,487.542 429,477.684L429,467.704C429,465.34,430.923,463.417,433.287,463.417L481,463.417C486.523,463.417,491,458.94,491,453.417L491,389.417C491,383.894,486.523,379.417,481,379.417z M284,34.142L342.858,93 284,93 284,34.142z M357,482L31,482 31,20 264,20 264,103C264,108.523,268.477,113,274,113L357,113 357,378.516 321.169,414.346C319.763,415.753 318.818,417.535 318.434,419.457 318.306,420.098 318.24,420.754 318.24,421.417 318.24,424.069 319.294,426.613 321.169,428.488L357,464.319 357,482z M471,443.417L433.287,443.417C419.895,443.417,409,454.312,409,467.704L409,477.684C409,480.177 407.342,481.235 406.354,481.645 405.364,482.054 403.443,482.478 401.682,480.715L342.383,421.417 401.681,362.119C403.444,360.357 405.365,360.781 406.353,361.19 407.341,361.599 408.999,362.658 408.999,365.15L408.999,375.13C408.999,388.522,419.894,399.417,433.286,399.417L471,399.417 471,443.417z" />
|
||||
</DrawingGroup>
|
||||
</DrawingGroup>
|
||||
</DrawingGroup>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
<DrawingImage x:Key="ImportWhiteDrawingImage">
|
||||
<DrawingImage.Drawing>
|
||||
<DrawingGroup ClipGeometry="M0,0 V330 H330 V0 H0 Z">
|
||||
<DrawingGroup>
|
||||
<GeometryDrawing Brush="White" Geometry="F1 M330,330z M0,0z M181.213,233.999L193.108,245.894C198.965,251.752 198.965,261.249 193.107,267.108 190.178,270.036 186.338,271.501 182.501,271.501 178.661,271.501 174.823,270.036 171.894,267.107L134.394,229.606C134.37,229.581 134.348,229.553 134.324,229.528 134.006,229.206 133.7,228.871 133.412,228.52 133.326,228.415 133.252,228.301 133.168,228.195 132.951,227.915 132.733,227.635 132.536,227.34 132.472,227.245 132.42,227.144 132.357,227.047 132.156,226.731 131.957,226.41 131.778,226.078 131.741,226.009 131.712,225.935 131.675,225.867 131.487,225.501 131.306,225.131 131.148,224.749 131.128,224.702 131.115,224.653 131.095,224.606 130.932,224.201 130.781,223.791 130.653,223.369 130.638,223.32 130.629,223.269 130.615,223.22 130.492,222.803 130.382,222.382 130.296,221.952 130.272,221.829 130.26,221.702 130.238,221.577 130.176,221.22 130.113,220.863 130.078,220.498 130.027,220.002 130.002,219.503 130.002,219 130.002,218.497 130.027,217.998 130.078,217.503 130.113,217.138 130.177,216.78 130.238,216.423 130.259,216.298 130.271,216.171 130.296,216.048 130.381,215.622 130.49,215.206 130.611,214.794 130.627,214.739 130.636,214.683 130.654,214.628 130.781,214.21 130.931,213.802 131.093,213.399 131.113,213.349 131.128,213.297 131.148,213.249 131.305,212.871 131.484,212.505 131.67,212.144 131.708,212.071 131.739,211.994 131.778,211.92 131.954,211.592 132.15,211.277 132.349,210.965 132.414,210.863 132.469,210.758 132.536,210.657 132.726,210.374 132.936,210.104 133.145,209.835 133.237,209.717 133.317,209.593 133.413,209.478 133.673,209.162 133.952,208.862 134.236,208.568 134.291,208.511 134.338,208.45 134.394,208.394L171.894,170.894C177.752,165.037 187.248,165.038 193.108,170.895 198.965,176.753 198.965,186.25 193.107,192.109L181.214,204.001 240,204 270,204 270,188.046 270,140 240,140 218.787,140 145,140C136.716,140,130,133.284,130,125L130,51.213 130,30 130,0 15,0C6.716,0,0,6.716,0,15L0,315C0,323.284,6.716,330,15,330L255,330C263.284,330,270,323.284,270,315L270,274.911 270,234 240,234 181.213,233.999z" />
|
||||
<GeometryDrawing Brush="White" Geometry="F1 M330,330z M0,0z M261.213,110L261.213,110 160,8.787 160,51.213 160,110 218.787,110z" />
|
||||
<GeometryDrawing Brush="White" Geometry="F1 M330,330z M0,0z M315,204L312.665,204 270,204 270,234 302.723,234 315,234C323.283,234 330,227.283 330,219 330,210.716 323.284,204 315,204z" />
|
||||
</DrawingGroup>
|
||||
</DrawingGroup>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
<DrawingImage x:Key="SearchDrawingImage">
|
||||
<DrawingImage.Drawing>
|
||||
<DrawingGroup ClipGeometry="M0,0 V30,239 H30,239 V0 H0 Z">
|
||||
<DrawingGroup>
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="F1 M30.239,30.239z M0,0z M20.194,3.46C15.581,-1.153 8.073,-1.153 3.46,3.46 -1.152,8.074 -1.152,15.581 3.46,20.195 7.568,24.302 13.966,24.742 18.576,21.535 18.673,21.994 18.895,22.432 19.252,22.789L25.97,29.507C26.949,30.484 28.531,30.484 29.505,29.507 30.483,28.529 30.483,26.947 29.505,25.972L22.787,19.252C22.432,18.898 21.993,18.675 21.534,18.578 24.743,13.967 24.303,7.57 20.194,3.46z M18.073,18.074C14.629,21.518 9.024,21.518 5.581,18.074 2.139,14.63 2.139,9.026 5.581,5.582 9.024,2.139 14.629,2.139 18.073,5.582 21.517,9.026 21.517,14.63 18.073,18.074z" />
|
||||
</DrawingGroup>
|
||||
</DrawingGroup>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
<DrawingImage x:Key="CurrentThemeSearchDrawingImage">
|
||||
<DrawingImage.Drawing>
|
||||
<DrawingGroup>
|
||||
<DrawingGroup>
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="F1 M30.239,30.239z M0,0z M20.194,3.46C15.581,-1.153 8.073,-1.153 3.46,3.46 -1.152,8.074 -1.152,15.581 3.46,20.195 7.568,24.302 13.966,24.742 18.576,21.535 18.673,21.994 18.895,22.432 19.252,22.789L25.97,29.507C26.949,30.484 28.531,30.484 29.505,29.507 30.483,28.529 30.483,26.947 29.505,25.972L22.787,19.252C22.432,18.898 21.993,18.675 21.534,18.578 24.743,13.967 24.303,7.57 20.194,3.46z M18.073,18.074C14.629,21.518 9.024,21.518 5.581,18.074 2.139,14.63 2.139,9.026 5.581,5.582 9.024,2.139 14.629,2.139 18.073,5.582 21.517,9.026 21.517,14.63 18.073,18.074z" />
|
||||
</DrawingGroup>
|
||||
</DrawingGroup>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
<DrawingImage x:Key="CleanSearchResultImage">
|
||||
<DrawingImage.Drawing>
|
||||
<DrawingGroup ClipGeometry="M0,0 V400 H400 V0 H0 Z">
|
||||
<DrawingGroup>
|
||||
<DrawingGroup>
|
||||
<DrawingGroup Transform="0.537948880142741,0,0,0.537948880142741,-24.5319792067894,-28.3943449193907">
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="F1 M400,400z M0,0z M709.207024,71.652532L537.866024,403.860532C538.849024,404.136532 539.830024,404.429532 540.804024,404.743532 548.039024,407.073532 554.832024,409.913532 561.157024,413.242532 568.803024,417.267532 575.754024,422.013532 581.964024,427.440532L753.645024,94.572532C759.974024,82.301532 755.158024,67.222532 742.886024,60.893532 730.614024,54.563532 715.537024,59.380532 709.207024,71.652532z">
|
||||
<GeometryDrawing.Pen>
|
||||
<Pen Brush="{Binding Path=IconColor}" Thickness="1" StartLineCap="Flat" EndLineCap="Flat" LineJoin="Miter" />
|
||||
</GeometryDrawing.Pen>
|
||||
</GeometryDrawing>
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="F1 M400,400z M0,0z M143.116024,687.765532C170.356024,712.332532 203.803024,733.739532 242.528024,751.388532 307.924024,781.196532 365.476024,789.998532 367.893024,790.359532 367.960024,790.369532 368.028024,790.378532 368.094024,790.387532 368.857024,790.491532 369.624024,790.543532 370.393024,790.543532 370.579024,790.543532 370.764024,790.540532 370.950024,790.534532 439.747024,788.288532 493.367024,765.376532 530.318024,722.434532 578.916024,665.957532 596.480024,581.038532 593.066024,508.033532 592.087024,487.131532 584.643024,465.796532 570.031024,450.574532 568.942024,449.440532 567.823024,448.332532 566.655024,447.268532 561.528024,442.603532 555.793024,438.702532 549.691024,435.470532 544.402024,432.669532 538.837024,430.371532 533.141024,428.537532 530.776024,427.775532 528.409024,427.199532 526.045024,426.775532 522.764024,426.186532 519.490024,425.900532 516.234024,425.900532 492.112024,425.900532 468.987024,441.061532 451.323024,456.546532 433.083024,472.538532 414.568024,489.967532 393.960024,503.619532 371.375024,518.581532 346.580024,526.116532 320.758024,533.470532 287.407024,542.968532 253.117024,549.034532 218.680024,552.899532 188.062024,556.334532 157.033024,558.332532 126.093024,558.332532 113.813024,558.332532 101.552024,558.017532 89.3300240000002,557.353532 88.6210240000002,557.315532 87.9120240000002,557.280532 87.2040240000002,557.231532 86.8100240000002,557.204532 86.4150240000002,557.190532 86.0230240000002,557.190532 80.7670240000002,557.190532 75.7790240000002,559.628532 72.5530240000002,563.835532 69.0860240000002,568.355532 68.1150240000002,574.311532 69.9690240000002,579.697532 83.9090240000002,620.204532 108.519024,656.563532 143.116024,687.765532z M119.317024,592.176532C119.327024,592.176532 119.337024,592.176532 119.348024,592.176532 121.066024,592.187532 122.843024,592.194532 124.667024,592.194532 149.677024,592.194532 184.527024,591.087532 223.623024,586.637532 306.343024,577.223532 373.776024,557.092532 424.826024,526.666532 426.276024,525.802532 427.905024,525.370532 429.537024,525.370532 431.078024,525.370532 432.620024,525.754532 434.016024,526.521532 463.688024,542.829532 509.797024,566.995532 542.675024,578.727532 546.744024,580.179532 549.262024,584.256532 548.770024,588.548532 544.843024,622.858532 533.706024,666.522532 504.441024,700.438532 474.467024,735.174532 430.205024,754.020532 372.840024,756.477532 372.661024,756.486532 372.482024,756.489532 372.303024,756.489532 371.559024,756.489532 370.818024,756.423532 370.083024,756.294532 364.302024,755.273532 350.041024,752.523532 330.904024,747.255532 336.359024,744.846532 342.002024,741.958532 347.705024,738.737532 352.811024,735.852532 357.961024,732.709532 363.059024,729.419532 378.830024,719.246532 394.102024,707.696532 405.984024,698.192532 408.733024,695.995532 406.154024,691.701532 402.908024,693.062532 376.933024,703.960532 343.747024,711.248532 314.054024,716.039532 304.721024,717.545532 295.739024,718.802532 287.429024,719.850532 277.709024,721.076532 268.921024,722.011532 261.588024,722.711532 259.677024,721.868532 257.761024,721.012532 255.838024,720.130532 239.313024,712.560532 223.895024,704.270532 209.639024,695.332532 215.861024,694.756532 222.399024,693.724532 229.030024,692.375532 235.054024,691.149532 241.147024,689.665532 247.144024,688.036532 264.803024,683.240532 281.595024,677.184532 293.081024,672.724532 295.267024,671.875532 294.488024,668.614532 292.153024,668.838532 271.246024,670.850532 242.247024,671.035532 217.483024,670.671532 209.371024,670.552532 201.716024,670.374532 194.947024,670.182532 186.045024,669.929532 178.683024,669.654532 173.839024,669.454532 170.998024,667.077532 168.214024,664.672532 165.513024,662.227532 162.018024,659.064532 158.652024,655.838532 155.394024,652.561532 160.421024,652.051532 165.640024,651.251532 170.940024,650.237532 175.896024,649.288532 180.916024,648.154532 185.909024,646.893532 205.628024,641.917532 224.868024,635.017532 237.596024,630.076532 239.782024,629.226532 239.003024,625.965532 236.668024,626.189532 217.040024,628.079532 190.281024,628.357532 166.589024,628.083532 160.745024,628.015532 155.090024,627.915532 149.773024,627.796532 143.856024,627.664532 138.359024,627.510532 133.495024,627.356532 126.611024,618.206532 120.528024,608.708532 115.276024,598.878532 113.655024,595.847532 115.884024,592.176532 119.317024,592.176532z">
|
||||
<GeometryDrawing.Pen>
|
||||
<Pen Brush="{Binding Path=IconColor}" Thickness="1" StartLineCap="Flat" EndLineCap="Flat" LineJoin="Miter" />
|
||||
</GeometryDrawing.Pen>
|
||||
</GeometryDrawing>
|
||||
</DrawingGroup>
|
||||
</DrawingGroup>
|
||||
<DrawingGroup>
|
||||
<DrawingGroup Transform="6.31268365832632,0,0,6.31268365832632,-39.4852029699823,-42.2472784434463">
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="F1 M400,400z M0,0z M28.199953,11.425928C23.586953,6.812928 16.078953,6.812928 11.465953,11.425928 6.853953,16.039928 6.853953,23.546928 11.465953,28.160928 15.573953,32.267928 21.971953,32.707928 26.581953,29.500928 26.678953,29.959928 26.900953,30.397928 27.257953,30.754928L33.975953,37.472928C34.954953,38.449928 36.536953,38.449928 37.510953,37.472928 38.488953,36.494928 38.488953,34.912928 37.510953,33.937928L30.792953,27.217928C30.437953,26.863928 29.998953,26.640928 29.539953,26.543928 32.748953,21.932928 32.308953,15.535928 28.199953,11.425928z M26.078953,26.039928C22.634953,29.483928 17.029953,29.483928 13.586953,26.039928 10.144953,22.595928 10.144953,16.991928 13.586953,13.547928 17.029953,10.104928 22.634953,10.104928 26.078953,13.547928 29.522953,16.991928 29.522953,22.595928 26.078953,26.039928z">
|
||||
<GeometryDrawing.Pen>
|
||||
<Pen Brush="{Binding Path=IconColor}" Thickness="1" StartLineCap="Flat" EndLineCap="Flat" LineJoin="Miter" />
|
||||
</GeometryDrawing.Pen>
|
||||
</GeometryDrawing>
|
||||
</DrawingGroup>
|
||||
</DrawingGroup>
|
||||
</DrawingGroup>
|
||||
</DrawingGroup>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
<DrawingImage x:Key="SearchNext">
|
||||
<DrawingImage.Drawing>
|
||||
<DrawingGroup ClipGeometry="M0,0 V30,239 H30,239 V0 H0 Z">
|
||||
<DrawingGroup>
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="F1 M30.239,30.239z M0,0z M20.194,3.46C15.581,-1.153 8.073,-1.153 3.46,3.46 -1.152,8.074 -1.152,15.581 3.46,20.195 7.568,24.302 13.966,24.742 18.576,21.535 18.673,21.994 18.895,22.432 19.252,22.789L25.97,29.507C26.949,30.484 28.531,30.484 29.505,29.507 30.483,28.529 30.483,26.947 29.505,25.972L22.787,19.252C22.432,18.898 21.993,18.675 21.534,18.578 24.743,13.967 24.303,7.57 20.194,3.46z M18.073,18.074C14.629,21.518 9.024,21.518 5.581,18.074 2.139,14.63 2.139,9.026 5.581,5.582 9.024,2.139 14.629,2.139 18.073,5.582 21.517,9.026 21.517,14.63 18.073,18.074z" />
|
||||
</DrawingGroup>
|
||||
<DrawingGroup Transform="0.85433776,0,0,0.90001926,-10.527022,-11.786157">
|
||||
<DrawingGroup>
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="F1 M30.239,30.239z M0,0z M33.258,25.352L26.85,20.01C26.531,19.744 26.086,19.688 25.712,19.863 25.337,20.039 25.098,20.416 25.098,20.83L25.098,23.088 19.757,23.088C19.167,23.088,18.689,23.567,18.689,24.156L18.689,28.179C18.689,28.769,19.167,29.247,19.757,29.247L25.098,29.247 25.098,31.508C25.098,31.923 25.337,32.3 25.712,32.476 25.858,32.543 26.012,32.578 26.165,32.578 26.41,32.578 26.653,32.494 26.85,32.33L33.258,26.99C33.501,26.787 33.643,26.486 33.643,26.17 33.643,25.854 33.501,25.555 33.258,25.352z" />
|
||||
</DrawingGroup>
|
||||
</DrawingGroup>
|
||||
</DrawingGroup>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
<DrawingImage x:Key="SearchPrevious">
|
||||
<DrawingImage.Drawing>
|
||||
<DrawingGroup ClipGeometry="M0,0 V30,239 H30,239 V0 H0 Z">
|
||||
<DrawingGroup>
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="F1 M30.239,30.239z M0,0z M20.194,3.46C15.581,-1.153 8.073,-1.153 3.46,3.46 -1.152,8.074 -1.152,15.581 3.46,20.195 7.568,24.302 13.966,24.742 18.576,21.535 18.673,21.994 18.895,22.432 19.252,22.789L25.97,29.507C26.949,30.484 28.531,30.484 29.505,29.507 30.483,28.529 30.483,26.947 29.505,25.972L22.787,19.252C22.432,18.898 21.993,18.675 21.534,18.578 24.743,13.967 24.303,7.57 20.194,3.46z M18.073,18.074C14.629,21.518 9.024,21.518 5.581,18.074 2.139,14.63 2.139,9.026 5.581,5.582 9.024,2.139 14.629,2.139 18.073,5.582 21.517,9.026 21.517,14.63 18.073,18.074z" />
|
||||
</DrawingGroup>
|
||||
<DrawingGroup Transform="0.98987893,0,0,0.72837591,-3.7343482,0.51496633">
|
||||
<DrawingGroup>
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="F1 M30.239,30.239z M0,0z M22.96,17.5L22.96,13.477C22.96,12.887,22.482,12.409,21.892,12.409L16.553,12.409 16.553,10.15C16.553,9.735 16.313,9.358 15.938,9.182 15.562,9.007 15.119,9.064 14.801,9.328L8.39,14.669C8.146,14.872 8.006,15.172 8.006,15.49 8.006,15.807 8.147,16.108 8.39,16.311L14.801,21.652C14.996,21.815 15.239,21.9 15.485,21.9 15.639,21.9 15.794,21.866 15.939,21.799 16.314,21.622 16.554,21.246 16.554,20.831L16.554,18.568 21.893,18.568C22.482,18.567,22.96,18.089,22.96,17.5z" />
|
||||
</DrawingGroup>
|
||||
</DrawingGroup>
|
||||
</DrawingGroup>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
<DrawingImage x:Key="CalendarDrawingImage">
|
||||
<DrawingImage.Drawing>
|
||||
<DrawingGroup>
|
||||
<DrawingGroup>
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="F1 M489.2,489.2z M0,0z M177.8,238.1C177.8,242.6,174.2,246.2,169.7,246.2L139.3,246.2C134.8,246.2,131.2,242.6,131.2,238.1L131.2,207.7C131.2,203.2,134.8,199.6,139.3,199.6L169.7,199.6C174.2,199.6,177.8,203.2,177.8,207.7L177.8,238.1z M241.3,207.8C241.3,203.3,237.7,199.7,233.2,199.7L202.8,199.7C198.3,199.7,194.7,203.3,194.7,207.8L194.7,238.2C194.7,242.7,198.3,246.3,202.8,246.3L233.2,246.3C237.7,246.3,241.3,242.7,241.3,238.2L241.3,207.8z M304.8,207.8C304.8,203.3,301.2,199.7,296.7,199.7L266.3,199.7C261.8,199.7,258.2,203.3,258.2,207.8L258.2,238.2C258.2,242.7,261.8,246.3,266.3,246.3L296.7,246.3C301.2,246.3,304.8,242.7,304.8,238.2L304.8,207.8z M177.8,269.6C177.8,265.1,174.2,261.5,169.7,261.5L139.3,261.5C134.8,261.5,131.2,265.1,131.2,269.6L131.2,300C131.2,304.5,134.8,308.1,139.3,308.1L169.7,308.1C174.2,308.1,177.8,304.5,177.8,300L177.8,269.6z M241.3,269.6C241.3,265.1,237.7,261.5,233.2,261.5L202.8,261.5C198.3,261.5,194.7,265.1,194.7,269.6L194.7,300C194.7,304.5,198.3,308.1,202.8,308.1L233.2,308.1C237.7,308.1,241.3,304.5,241.3,300L241.3,269.6z M296.7,261.5L266.3,261.5C261.8,261.5,258.2,265.1,258.2,269.6L258.2,300C258.2,304.5,261.8,308.1,266.3,308.1L296.7,308.1C301.2,308.1,304.8,304.5,304.8,300L304.8,269.6C304.8,265.1,301.2,261.5,296.7,261.5z M106.1,323.3L75.8,323.3C71.3,323.3,67.7,326.9,67.7,331.4L67.7,361.8C67.7,366.3,71.3,369.9,75.8,369.9L106.2,369.9C110.7,369.9,114.3,366.3,114.3,361.8L114.3,331.4C114.3,326.9,110.6,323.3,106.1,323.3z M114.3,269.6C114.3,265.1,110.7,261.5,106.2,261.5L75.8,261.5C71.3,261.5,67.7,265.1,67.7,269.6L67.7,300C67.7,304.5,71.3,308.1,75.8,308.1L106.2,308.1C110.7,308.1,114.3,304.5,114.3,300L114.3,269.6z M233.2,323.3L202.8,323.3C198.3,323.3,194.7,326.9,194.7,331.4L194.7,361.8C194.7,366.3,198.3,369.9,202.8,369.9L233.2,369.9C237.7,369.9,241.3,366.3,241.3,361.8L241.3,331.4C241.3,326.9,237.7,323.3,233.2,323.3z M169.7,323.3L139.3,323.3C134.8,323.3,131.2,326.9,131.2,331.4L131.2,361.8C131.2,366.3,134.8,369.9,139.3,369.9L169.7,369.9C174.2,369.9,177.8,366.3,177.8,361.8L177.8,331.4C177.8,326.9,174.2,323.3,169.7,323.3z M360.2,246.3C364.7,246.3,368.3,242.7,368.3,238.2L368.3,207.8C368.3,203.3,364.7,199.7,360.2,199.7L329.8,199.7C325.3,199.7,321.7,203.3,321.7,207.8L321.7,238.2C321.7,242.7,325.3,246.3,329.8,246.3L360.2,246.3z M47.7,435.9L278.4,435.9C274.7,424.3,272.6,411.9,272.5,399.1L47.7,399.1C41.7,399.1,36.9,394.2,36.9,388.3L36.9,171 398.6,171 398.6,272.1C411.4,272.2,423.8,274.1,435.4,277.8L435.4,94.9C435.4,68.6,414,47.2,387.7,47.2L334.3,47.2 334.3,17.8C334.3,8.2,326.5,0.400000000000002,316.9,0.400000000000002L289.8,0.400000000000002C280.2,0.400000000000002,272.4,8.2,272.4,17.8L272.4,47.3 163,47.3 163,17.8C163,8.2,155.2,0.400000000000002,145.6,0.400000000000002L118.5,0.400000000000002C108.9,0.400000000000002,101.1,8.2,101.1,17.8L101.1,47.3 47.7,47.3C21.4,47.3,0,68.7,0,95L0,388.3C0,414.5,21.4,435.9,47.7,435.9z M489.2,397.7C489.2,448 448.4,488.8 398.1,488.8 347.8,488.8 307,448 307,397.7 307,347.4 347.8,306.6 398.1,306.6 448.4,306.6 489.2,347.4 489.2,397.7z M444.1,374.1C444.1,371.2 443,368.4 440.9,366.4 436.6,362.1 429.7,362.1 425.4,366.4L385.8,406 370.6,390.8C366.3,386.5 359.4,386.5 355.1,390.8 353,392.9 351.9,395.6 351.9,398.5 351.9,401.4 353,404.2 355.1,406.2L378,429.1C382.3,433.4,389.2,433.4,393.5,429.1L440.8,381.8C443,379.8,444.1,377,444.1,374.1z" />
|
||||
</DrawingGroup>
|
||||
</DrawingGroup>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
<DrawingImage x:Key="ClockDrawingImage">
|
||||
<DrawingImage.Drawing>
|
||||
<DrawingGroup>
|
||||
<DrawingGroup>
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="F1 M559.98,559.98z M0,0z M279.99,0C125.601,0 0,125.601 0,279.99 0,434.38 125.601,559.98 279.99,559.98 434.38,559.98 559.98,434.379 559.98,279.99 559.98,125.601 434.38,0 279.99,0z M279.99,498.78C159.346,498.78 61.2,400.634 61.2,279.99 61.2,159.352 159.346,61.2 279.99,61.2 400.634,61.2 498.78,159.352 498.78,279.99 498.78,400.634 400.634,498.78 279.99,498.78z" />
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="F1 M559.98,559.98z M0,0z M304.226,280.326L304.226,162.976C304.226,149.873 293.608,139.255 280.51,139.255 267.408,139.255 256.789,149.873 256.789,162.976L256.789,287.904C256.789,288.277 256.881,288.627 256.899,289 256.587,295.45 258.809,301.999 263.735,306.926L352.078,395.262C361.344,404.528 376.362,404.528 385.621,395.262 394.881,385.996 394.887,370.978 385.621,361.718L304.226,280.326z" />
|
||||
</DrawingGroup>
|
||||
</DrawingGroup>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
<DrawingImage x:Key="GoToTimestampDrawingImage">
|
||||
<DrawingImage.Drawing>
|
||||
<DrawingGroup>
|
||||
<DrawingGroup>
|
||||
<DrawingGroup>
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="F1 M640,640z M0,0z M271.15,0.83L281.24,1.86 291.22,3.29 301.07,5.1 310.78,7.3 320.34,9.86 329.75,12.8 339,16.09 348.08,19.73 356.98,23.7 365.7,28.01 374.22,32.65 382.54,37.6 390.65,42.86 398.54,48.42 406.2,54.27 413.63,60.4 420.82,66.81 427.75,73.49 434.43,80.42 440.84,87.61 446.97,95.04 452.82,102.7 458.38,110.59 463.64,118.7 468.59,127.02 473.23,135.54 477.54,144.26 481.51,153.16 485.15,162.24 488.44,171.49 491.38,180.9 493.94,190.46 496.14,200.17 497.95,210.02 499.38,220 500.41,230.09 501.03,240.3 501.24,250.62 501.2,254.83 501.1,259.02 500.93,263.19 500.68,267.34 500.37,271.48 499.99,275.59 499.54,279.69 499.03,283.76 498.45,287.82 497.81,291.85 497.1,295.86 496.33,299.85 495.49,303.82 494.59,307.76 493.63,311.68 492.61,315.58 491.52,319.45 490.38,323.29 489.17,327.11 487.91,330.9 486.59,334.67 485.2,338.41 483.77,342.12 482.27,345.8 480.72,349.46 479.11,353.08 477.45,356.67 475.73,360.24 473.95,363.77 472.13,367.27 470.25,370.74 468.32,374.17 466.34,377.58 464.3,380.95 462.22,384.28 460.08,387.58 457.9,390.85 455.67,394.08 453.39,397.27 451.06,400.43 640,589.37 589.37,640 400.43,451.06 397.27,453.39 394.08,455.67 390.85,457.9 387.58,460.08 384.28,462.22 380.95,464.3 377.58,466.34 374.17,468.32 370.74,470.25 367.27,472.13 363.77,473.95 360.24,475.73 356.67,477.45 353.08,479.11 349.46,480.72 345.8,482.27 342.12,483.77 338.41,485.2 334.67,486.59 330.9,487.91 327.11,489.17 323.29,490.38 319.45,491.52 315.58,492.61 311.68,493.63 307.76,494.59 303.82,495.49 299.85,496.33 295.86,497.1 291.85,497.81 287.82,498.45 283.76,499.03 279.69,499.54 275.59,499.99 271.48,500.37 267.34,500.68 263.19,500.93 259.02,501.1 254.83,501.2 250.62,501.24 240.3,501.03 230.09,500.41 220,499.38 210.02,497.95 200.17,496.14 190.46,493.94 180.9,491.38 171.49,488.44 162.24,485.15 153.16,481.51 144.26,477.54 135.54,473.23 127.02,468.59 118.7,463.64 110.59,458.38 102.7,452.82 95.04,446.97 87.61,440.84 80.42,434.43 73.49,427.75 66.81,420.82 60.4,413.63 54.27,406.2 48.42,398.54 42.86,390.65 37.6,382.54 32.65,374.22 28.01,365.7 23.7,356.98 19.73,348.08 16.09,339 12.8,329.75 9.86,320.34 7.3,310.78 5.1,301.07 3.29,291.22 1.86,281.24 0.83,271.15 0.21,260.94 0,250.62 0.21,240.3 0.83,230.09 1.86,220 3.29,210.02 5.1,200.17 7.3,190.46 9.86,180.9 12.8,171.49 16.09,162.24 19.73,153.16 23.7,144.26 28.01,135.54 32.65,127.02 37.6,118.7 42.86,110.59 48.42,102.7 54.27,95.04 60.4,87.61 66.81,80.42 73.49,73.49 80.42,66.81 87.61,60.4 95.04,54.27 102.7,48.42 110.59,42.86 118.7,37.6 127.02,32.65 135.54,28.01 144.26,23.7 153.16,19.73 162.24,16.09 171.49,12.8 180.9,9.86 190.46,7.3 200.17,5.1 210.02,3.29 220,1.86 230.09,0.83 240.3,0.21 250.62,0 260.94,0.21 271.15,0.83z M232.05,24.62L222.91,25.55 213.89,26.84 204.98,28.48 196.19,30.47 187.54,32.79 179.02,35.45 170.66,38.42 162.44,41.72 154.39,45.31 146.5,49.22 138.79,53.41 131.26,57.89 123.93,62.65 116.79,67.67 109.85,72.97 103.13,78.52 96.63,84.32 90.36,90.36 84.32,96.63 78.52,103.13 72.97,109.85 67.67,116.79 62.65,123.93 57.89,131.26 53.41,138.79 49.22,146.5 45.31,154.39 41.72,162.44 38.42,170.66 35.45,179.02 32.79,187.54 30.47,196.19 28.48,204.98 26.84,213.89 25.55,222.91 24.62,232.05 24.06,241.29 23.87,250.62 24.06,259.95 24.62,269.19 25.55,278.33 26.84,287.35 28.48,296.26 30.47,305.05 32.79,313.7 35.45,322.22 38.42,330.58 41.72,338.8 45.31,346.85 49.22,354.74 53.41,362.45 57.89,369.98 62.65,377.31 67.67,384.45 72.97,391.39 78.52,398.11 84.32,404.61 90.36,410.88 96.63,416.92 103.13,422.72 109.85,428.27 116.79,433.57 123.93,438.59 131.26,443.35 138.79,447.83 146.5,452.02 154.39,455.93 162.44,459.52 170.66,462.82 179.02,465.79 187.54,468.45 196.19,470.77 204.98,472.76 213.89,474.4 222.91,475.69 232.05,476.62 241.29,477.18 250.62,477.37 259.95,477.18 269.19,476.62 278.33,475.69 287.35,474.4 296.26,472.76 305.05,470.77 313.7,468.45 322.22,465.79 330.58,462.82 338.8,459.52 346.85,455.93 354.74,452.02 362.45,447.83 369.98,443.35 377.31,438.59 384.45,433.57 391.39,428.27 398.11,422.72 404.61,416.92 410.88,410.88 416.92,404.61 422.72,398.11 428.27,391.39 433.57,384.45 438.59,377.31 443.35,369.98 447.83,362.45 452.02,354.74 455.93,346.85 459.52,338.8 462.82,330.58 465.79,322.22 468.45,313.7 470.77,305.05 472.76,296.26 474.4,287.35 475.69,278.33 476.62,269.19 477.18,259.95 477.37,250.62 477.18,241.29 476.62,232.05 475.69,222.91 474.4,213.89 472.76,204.98 470.77,196.19 468.45,187.54 465.79,179.02 462.82,170.66 459.52,162.44 455.93,154.39 452.02,146.5 447.83,138.79 443.35,131.26 438.59,123.93 433.57,116.79 428.27,109.85 422.72,103.13 416.92,96.63 410.88,90.36 404.61,84.32 398.11,78.52 391.39,72.97 384.45,67.67 377.31,62.65 369.98,57.89 362.45,53.41 354.74,49.22 346.85,45.31 338.8,41.72 330.58,38.42 322.22,35.45 313.7,32.79 305.05,30.47 296.26,28.48 287.35,26.84 278.33,25.55 269.19,24.62 259.95,24.06 250.62,23.87 241.29,24.06 232.05,24.62z" />
|
||||
<DrawingGroup>
|
||||
<GeometryDrawing Geometry="F1 M640,640z M0,0z M271.15,0.83L281.24,1.86 291.22,3.29 301.07,5.1 310.78,7.3 320.34,9.86 329.75,12.8 339,16.09 348.08,19.73 356.98,23.7 365.7,28.01 374.22,32.65 382.54,37.6 390.65,42.86 398.54,48.42 406.2,54.27 413.63,60.4 420.82,66.81 427.75,73.49 434.43,80.42 440.84,87.61 446.97,95.04 452.82,102.7 458.38,110.59 463.64,118.7 468.59,127.02 473.23,135.54 477.54,144.26 481.51,153.16 485.15,162.24 488.44,171.49 491.38,180.9 493.94,190.46 496.14,200.17 497.95,210.02 499.38,220 500.41,230.09 501.03,240.3 501.24,250.62 501.2,254.83 501.1,259.02 500.93,263.19 500.68,267.34 500.37,271.48 499.99,275.59 499.54,279.69 499.03,283.76 498.45,287.82 497.81,291.85 497.1,295.86 496.33,299.85 495.49,303.82 494.59,307.76 493.63,311.68 492.61,315.58 491.52,319.45 490.38,323.29 489.17,327.11 487.91,330.9 486.59,334.67 485.2,338.41 483.77,342.12 482.27,345.8 480.72,349.46 479.11,353.08 477.45,356.67 475.73,360.24 473.95,363.77 472.13,367.27 470.25,370.74 468.32,374.17 466.34,377.58 464.3,380.95 462.22,384.28 460.08,387.58 457.9,390.85 455.67,394.08 453.39,397.27 451.06,400.43 640,589.37 589.37,640 400.43,451.06 397.27,453.39 394.08,455.67 390.85,457.9 387.58,460.08 384.28,462.22 380.95,464.3 377.58,466.34 374.17,468.32 370.74,470.25 367.27,472.13 363.77,473.95 360.24,475.73 356.67,477.45 353.08,479.11 349.46,480.72 345.8,482.27 342.12,483.77 338.41,485.2 334.67,486.59 330.9,487.91 327.11,489.17 323.29,490.38 319.45,491.52 315.58,492.61 311.68,493.63 307.76,494.59 303.82,495.49 299.85,496.33 295.86,497.1 291.85,497.81 287.82,498.45 283.76,499.03 279.69,499.54 275.59,499.99 271.48,500.37 267.34,500.68 263.19,500.93 259.02,501.1 254.83,501.2 250.62,501.24 240.3,501.03 230.09,500.41 220,499.38 210.02,497.95 200.17,496.14 190.46,493.94 180.9,491.38 171.49,488.44 162.24,485.15 153.16,481.51 144.26,477.54 135.54,473.23 127.02,468.59 118.7,463.64 110.59,458.38 102.7,452.82 95.04,446.97 87.61,440.84 80.42,434.43 73.49,427.75 66.81,420.82 60.4,413.63 54.27,406.2 48.42,398.54 42.86,390.65 37.6,382.54 32.65,374.22 28.01,365.7 23.7,356.98 19.73,348.08 16.09,339 12.8,329.75 9.86,320.34 7.3,310.78 5.1,301.07 3.29,291.22 1.86,281.24 0.83,271.15 0.21,260.94 0,250.62 0.21,240.3 0.83,230.09 1.86,220 3.29,210.02 5.1,200.17 7.3,190.46 9.86,180.9 12.8,171.49 16.09,162.24 19.73,153.16 23.7,144.26 28.01,135.54 32.65,127.02 37.6,118.7 42.86,110.59 48.42,102.7 54.27,95.04 60.4,87.61 66.81,80.42 73.49,73.49 80.42,66.81 87.61,60.4 95.04,54.27 102.7,48.42 110.59,42.86 118.7,37.6 127.02,32.65 135.54,28.01 144.26,23.7 153.16,19.73 162.24,16.09 171.49,12.8 180.9,9.86 190.46,7.3 200.17,5.1 210.02,3.29 220,1.86 230.09,0.83 240.3,0.21 250.62,0 260.94,0.21 271.15,0.83z M232.05,24.62L222.91,25.55 213.89,26.84 204.98,28.48 196.19,30.47 187.54,32.79 179.02,35.45 170.66,38.42 162.44,41.72 154.39,45.31 146.5,49.22 138.79,53.41 131.26,57.89 123.93,62.65 116.79,67.67 109.85,72.97 103.13,78.52 96.63,84.32 90.36,90.36 84.32,96.63 78.52,103.13 72.97,109.85 67.67,116.79 62.65,123.93 57.89,131.26 53.41,138.79 49.22,146.5 45.31,154.39 41.72,162.44 38.42,170.66 35.45,179.02 32.79,187.54 30.47,196.19 28.48,204.98 26.84,213.89 25.55,222.91 24.62,232.05 24.06,241.29 23.87,250.62 24.06,259.95 24.62,269.19 25.55,278.33 26.84,287.35 28.48,296.26 30.47,305.05 32.79,313.7 35.45,322.22 38.42,330.58 41.72,338.8 45.31,346.85 49.22,354.74 53.41,362.45 57.89,369.98 62.65,377.31 67.67,384.45 72.97,391.39 78.52,398.11 84.32,404.61 90.36,410.88 96.63,416.92 103.13,422.72 109.85,428.27 116.79,433.57 123.93,438.59 131.26,443.35 138.79,447.83 146.5,452.02 154.39,455.93 162.44,459.52 170.66,462.82 179.02,465.79 187.54,468.45 196.19,470.77 204.98,472.76 213.89,474.4 222.91,475.69 232.05,476.62 241.29,477.18 250.62,477.37 259.95,477.18 269.19,476.62 278.33,475.69 287.35,474.4 296.26,472.76 305.05,470.77 313.7,468.45 322.22,465.79 330.58,462.82 338.8,459.52 346.85,455.93 354.74,452.02 362.45,447.83 369.98,443.35 377.31,438.59 384.45,433.57 391.39,428.27 398.11,422.72 404.61,416.92 410.88,410.88 416.92,404.61 422.72,398.11 428.27,391.39 433.57,384.45 438.59,377.31 443.35,369.98 447.83,362.45 452.02,354.74 455.93,346.85 459.52,338.8 462.82,330.58 465.79,322.22 468.45,313.7 470.77,305.05 472.76,296.26 474.4,287.35 475.69,278.33 476.62,269.19 477.18,259.95 477.37,250.62 477.18,241.29 476.62,232.05 475.69,222.91 474.4,213.89 472.76,204.98 470.77,196.19 468.45,187.54 465.79,179.02 462.82,170.66 459.52,162.44 455.93,154.39 452.02,146.5 447.83,138.79 443.35,131.26 438.59,123.93 433.57,116.79 428.27,109.85 422.72,103.13 416.92,96.63 410.88,90.36 404.61,84.32 398.11,78.52 391.39,72.97 384.45,67.67 377.31,62.65 369.98,57.89 362.45,53.41 354.74,49.22 346.85,45.31 338.8,41.72 330.58,38.42 322.22,35.45 313.7,32.79 305.05,30.47 296.26,28.48 287.35,26.84 278.33,25.55 269.19,24.62 259.95,24.06 250.62,23.87 241.29,24.06 232.05,24.62z"/>
|
||||
</DrawingGroup>
|
||||
</DrawingGroup>
|
||||
<DrawingGroup>
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="F1 M640,640z M0,0z M269.61,5.63L279.57,6.65 289.4,8.07 299.11,9.86 308.68,12.03 318.11,14.56 327.38,17.45 336.5,20.7 345.44,24.28 354.21,28.2 362.8,32.45 371.19,37.01 379.39,41.89 387.37,47.06 395.14,52.54 402.69,58.3 410,64.34 417.08,70.64 423.91,77.22 430.48,84.05 436.79,91.12 442.83,98.44 448.59,105.98 454.06,113.75 459.24,121.74 464.12,129.93 468.68,138.33 472.93,146.91 476.85,155.68 480.43,164.63 483.67,173.74 486.57,183.02 489.1,192.44 491.27,202.02 493.06,211.72 494.47,221.56 495.5,231.52 496.12,241.59 496.34,251.76 496.13,261.94 495.52,272.02 494.51,281.98 493.11,291.82 491.32,301.53 489.16,311.11 486.63,320.54 483.75,329.82 480.51,338.94 476.93,347.89 473.01,356.67 468.77,365.26 464.21,373.66 459.34,381.85 454.16,389.84 448.69,397.62 442.93,405.17 436.89,412.49 430.58,419.57 424,426.4 417.17,432.97 410.09,439.28 402.77,445.32 395.22,451.08 387.45,456.55 379.46,461.73 371.26,466.6 362.86,471.17 354.27,475.41 345.5,479.32 336.55,482.9 327.43,486.14 318.15,489.03 308.72,491.55 299.14,493.71 289.43,495.5 279.58,496.9 269.62,497.91 259.55,498.53 249.37,498.73 239.19,498.53 229.11,497.91 219.15,496.9 209.31,495.5 199.59,493.71 190.02,491.55 180.58,489.03 171.3,486.14 162.18,482.9 153.23,479.32 144.46,475.41 135.87,471.17 127.47,466.6 119.27,461.73 111.28,456.55 103.51,451.08 95.96,445.32 88.64,439.28 81.56,432.97 74.73,426.4 68.16,419.57 61.84,412.49 55.81,405.17 50.05,397.62 44.57,389.84 39.4,381.85 34.52,373.66 29.96,365.26 25.72,356.67 21.8,347.89 18.22,338.94 14.99,329.82 12.1,320.54 9.57,311.11 7.41,301.53 5.63,291.82 4.22,281.98 3.21,272.02 2.6,261.94 2.39,251.76 2.6,241.58 3.21,231.51 4.22,221.54 5.63,211.7 7.41,201.99 9.57,192.41 12.1,182.98 14.99,173.7 18.22,164.58 21.8,155.63 25.72,146.85 29.96,138.26 34.52,129.86 39.4,121.67 44.57,113.68 50.05,105.9 55.81,98.35 61.84,91.03 68.16,83.96 74.73,77.13 81.56,70.55 88.64,64.24 95.96,58.2 103.51,52.44 111.28,46.97 119.27,41.79 127.47,36.92 135.87,32.36 144.46,28.11 153.23,24.2 162.18,20.62 171.3,17.38 180.58,14.49 190.02,11.97 199.59,9.81 209.31,8.02 219.15,6.62 229.11,5.61 239.19,4.99 249.37,4.79 259.54,5.01 269.61,5.63z M259.95,70.39L259.93,70.82 259.88,71.24 259.82,71.67 259.75,72.08 259.65,72.49 259.54,72.9 259.42,73.3 259.28,73.69 259.13,74.07 258.96,74.45 258.78,74.82 258.58,75.18 258.37,75.53 258.15,75.87 257.92,76.21 257.67,76.53 257.41,76.84 257.14,77.15 256.86,77.44 256.56,77.72 256.26,77.99 255.95,78.25 255.62,78.5 255.29,78.73 254.95,78.96 254.6,79.17 254.24,79.36 253.87,79.54 253.49,79.71 253.11,79.86 252.71,80 252.32,80.13 251.91,80.24 251.5,80.33 251.08,80.41 250.66,80.47 250.24,80.51 249.8,80.53 249.37,80.54 248.93,80.53 248.5,80.51 248.07,80.47 247.65,80.41 247.23,80.33 246.82,80.24 246.42,80.13 246.02,80 245.63,79.86 245.24,79.71 244.87,79.54 244.5,79.36 244.14,79.17 243.79,78.96 243.44,78.73 243.11,78.5 242.79,78.25 242.47,77.99 242.17,77.72 241.87,77.44 241.59,77.15 241.32,76.84 241.06,76.53 240.82,76.21 240.58,75.87 240.36,75.53 240.15,75.18 239.95,74.82 239.77,74.45 239.6,74.07 239.45,73.69 239.31,73.3 239.19,72.9 239.08,72.49 238.99,72.08 238.91,71.67 238.85,71.24 238.81,70.82 238.78,70.39 238.77,69.95 238.77,26.51 230.1,27.09 221.53,27.99 213.05,29.2 204.68,30.73 196.42,32.56 188.28,34.69 180.26,37.11 172.37,39.81 164.61,42.79 157,46.05 149.53,49.58 142.22,53.36 135.07,57.41 128.08,61.7 121.26,66.23 114.62,71.01 108.16,76.01 101.9,81.24 95.83,86.69 89.96,92.35 84.29,98.22 78.84,104.29 73.61,110.56 68.61,117.02 63.84,123.66 59.3,130.47 55.01,137.46 50.97,144.61 47.18,151.93 43.66,159.39 40.4,167.01 37.42,174.76 34.71,182.65 32.29,190.67 30.17,198.81 28.34,207.07 26.81,215.45 25.59,223.92 24.69,232.5 24.11,241.17 67.55,241.17 67.99,241.17 68.42,241.2 68.85,241.24 69.27,241.3 69.69,241.38 70.1,241.47 70.5,241.58 70.9,241.71 71.29,241.84 71.68,242 72.05,242.17 72.42,242.35 72.78,242.54 73.14,242.75 73.48,242.98 73.81,243.21 74.14,243.46 74.45,243.72 74.75,243.99 75.05,244.27 75.33,244.56 75.6,244.87 75.86,245.18 76.11,245.5 76.34,245.84 76.56,246.18 76.77,246.53 76.97,246.89 77.15,247.26 77.32,247.64 77.47,248.02 77.61,248.41 77.73,248.81 77.84,249.21 77.93,249.63 78.01,250.04 78.07,250.46 78.11,250.89 78.14,251.32 78.15,251.76 78.14,252.2 78.11,252.63 78.07,253.06 78.01,253.48 77.93,253.9 77.84,254.31 77.73,254.71 77.61,255.11 77.47,255.5 77.32,255.88 77.15,256.26 76.97,256.63 76.77,256.99 76.56,257.34 76.34,257.68 76.11,258.02 75.86,258.34 75.6,258.66 75.33,258.96 75.05,259.25 74.75,259.53 74.45,259.81 74.14,260.06 73.81,260.31 73.48,260.55 73.14,260.77 72.78,260.98 72.42,261.17 72.05,261.36 71.68,261.52 71.29,261.68 70.9,261.82 70.5,261.94 70.1,262.05 69.69,262.14 69.27,262.22 68.85,262.28 68.42,262.32 67.99,262.35 67.55,262.36 24.11,262.36 24.69,271.02 25.59,279.6 26.81,288.08 28.34,296.45 30.17,304.71 32.29,312.85 34.71,320.87 37.42,328.76 40.4,336.51 43.66,344.13 47.18,351.59 50.97,358.91 55.01,366.06 59.3,373.05 63.84,379.87 68.61,386.51 73Line truncated
|
||||
<DrawingGroup>
|
||||
<GeometryDrawing Geometry="F1 M640,640z M0,0z M269.61,5.63L279.57,6.65 289.4,8.07 299.11,9.86 308.68,12.03 318.11,14.56 327.38,17.45 336.5,20.7 345.44,24.28 354.21,28.2 362.8,32.45 371.19,37.01 379.39,41.89 387.37,47.06 395.14,52.54 402.69,58.3 410,64.34 417.08,70.64 423.91,77.22 430.48,84.05 436.79,91.12 442.83,98.44 448.59,105.98 454.06,113.75 459.24,121.74 464.12,129.93 468.68,138.33 472.93,146.91 476.85,155.68 480.43,164.63 483.67,173.74 486.57,183.02 489.1,192.44 491.27,202.02 493.06,211.72 494.47,221.56 495.5,231.52 496.12,241.59 496.34,251.76 496.13,261.94 495.52,272.02 494.51,281.98 493.11,291.82 491.32,301.53 489.16,311.11 486.63,320.54 483.75,329.82 480.51,338.94 476.93,347.89 473.01,356.67 468.77,365.26 464.21,373.66 459.34,381.85 454.16,389.84 448.69,397.62 442.93,405.17 436.89,412.49 430.58,419.57 424,426.4 417.17,432.97 410.09,439.28 402.77,445.32 395.22,451.08 387.45,456.55 379.46,461.73 371.26,466.6 362.86,471.17 354.27,475.41 345.5,479.32 336.55,482.9 327.43,486.14 318.15,489.03 308.72,491.55 299.14,493.71 289.43,495.5 279.58,496.9 269.62,497.91 259.55,498.53 249.37,498.73 239.19,498.53 229.11,497.91 219.15,496.9 209.31,495.5 199.59,493.71 190.02,491.55 180.58,489.03 171.3,486.14 162.18,482.9 153.23,479.32 144.46,475.41 135.87,471.17 127.47,466.6 119.27,461.73 111.28,456.55 103.51,451.08 95.96,445.32 88.64,439.28 81.56,432.97 74.73,426.4 68.16,419.57 61.84,412.49 55.81,405.17 50.05,397.62 44.57,389.84 39.4,381.85 34.52,373.66 29.96,365.26 25.72,356.67 21.8,347.89 18.22,338.94 14.99,329.82 12.1,320.54 9.57,311.11 7.41,301.53 5.63,291.82 4.22,281.98 3.21,272.02 2.6,261.94 2.39,251.76 2.6,241.58 3.21,231.51 4.22,221.54 5.63,211.7 7.41,201.99 9.57,192.41 12.1,182.98 14.99,173.7 18.22,164.58 21.8,155.63 25.72,146.85 29.96,138.26 34.52,129.86 39.4,121.67 44.57,113.68 50.05,105.9 55.81,98.35 61.84,91.03 68.16,83.96 74.73,77.13 81.56,70.55 88.64,64.24 95.96,58.2 103.51,52.44 111.28,46.97 119.27,41.79 127.47,36.92 135.87,32.36 144.46,28.11 153.23,24.2 162.18,20.62 171.3,17.38 180.58,14.49 190.02,11.97 199.59,9.81 209.31,8.02 219.15,6.62 229.11,5.61 239.19,4.99 249.37,4.79 259.54,5.01 269.61,5.63z M259.95,70.39L259.93,70.82 259.88,71.24 259.82,71.67 259.75,72.08 259.65,72.49 259.54,72.9 259.42,73.3 259.28,73.69 259.13,74.07 258.96,74.45 258.78,74.82 258.58,75.18 258.37,75.53 258.15,75.87 257.92,76.21 257.67,76.53 257.41,76.84 257.14,77.15 256.86,77.44 256.56,77.72 256.26,77.99 255.95,78.25 255.62,78.5 255.29,78.73 254.95,78.96 254.6,79.17 254.24,79.36 253.87,79.54 253.49,79.71 253.11,79.86 252.71,80 252.32,80.13 251.91,80.24 251.5,80.33 251.08,80.41 250.66,80.47 250.24,80.51 249.8,80.53 249.37,80.54 248.93,80.53 248.5,80.51 248.07,80.47 247.65,80.41 247.23,80.33 246.82,80.24 246.42,80.13 246.02,80 245.63,79.86 245.24,79.71 244.87,79.54 244.5,79.36 244.14,79.17 243.79,78.96 243.44,78.73 243.11,78.5 242.79,78.25 242.47,77.99 242.17,77.72 241.87,77.44 241.59,77.15 241.32,76.84 241.06,76.53 240.82,76.21 240.58,75.87 240.36,75.53 240.15,75.18 239.95,74.82 239.77,74.45 239.6,74.07 239.45,73.69 239.31,73.3 239.19,72.9 239.08,72.49 238.99,72.08 238.91,71.67 238.85,71.24 238.81,70.82 238.78,70.39 238.77,69.95 238.77,26.51 230.1,27.09 221.53,27.99 213.05,29.2 204.68,30.73 196.42,32.56 188.28,34.69 180.26,37.11 172.37,39.81 164.61,42.79 157,46.05 149.53,49.58 142.22,53.36 135.07,57.41 128.08,61.7 121.26,66.23 114.62,71.01 108.16,76.01 101.9,81.24 95.83,86.69 89.96,92.35 84.29,98.22 78.84,104.29 73.61,110.56 68.61,117.02 63.84,123.66 59.3,130.47 55.01,137.46 50.97,144.61 47.18,151.93 43.66,159.39 40.4,167.01 37.42,174.76 34.71,182.65 32.29,190.67 30.17,198.81 28.34,207.07 26.81,215.45 25.59,223.92 24.69,232.5 24.11,241.17 67.55,241.17 67.99,241.17 68.42,241.2 68.85,241.24 69.27,241.3 69.69,241.38 70.1,241.47 70.5,241.58 70.9,241.71 71.29,241.84 71.68,242 72.05,242.17 72.42,242.35 72.78,242.54 73.14,242.75 73.48,242.98 73.81,243.21 74.14,243.46 74.45,243.72 74.75,243.99 75.05,244.27 75.33,244.56 75.6,244.87 75.86,245.18 76.11,245.5 76.34,245.84 76.56,246.18 76.77,246.53 76.97,246.89 77.15,247.26 77.32,247.64 77.47,248.02 77.61,248.41 77.73,248.81 77.84,249.21 77.93,249.63 78.01,250.04 78.07,250.46 78.11,250.89 78.14,251.32 78.15,251.76 78.14,252.2 78.11,252.63 78.07,253.06 78.01,253.48 77.93,253.9 77.84,254.31 77.73,254.71 77.61,255.11 77.47,255.5 77.32,255.88 77.15,256.26 76.97,256.63 76.77,256.99 76.56,257.34 76.34,257.68 76.11,258.02 75.86,258.34 75.6,258.66 75.33,258.96 75.05,259.25 74.75,259.53 74.45,259.81 74.14,260.06 73.81,260.31 73.48,260.55 73.14,260.77 72.78,260.98 72.42,261.17 72.05,261.36 71.68,261.52 71.29,261.68 70.9,261.82 70.5,261.94 70.1,262.05 69.69,262.14 69.27,262.22 68.85,262.28 68.42,262.32 67.99,262.35 67.55,262.36 24.11,262.36 24.69,271.02 25.59,279.6 26.81,288.08 28.34,296.45 30.17,304.71 32.29,312.85 34.71,320.87 37.42,328.76 40.4,336.51 43.66,344.13 47.18,351.59 50.97,358.91 55.01,366.06 59.3,373.05 63.84,379.87 68.61,386.51 73.61,392.96 78.84,399.23 84.29,Line truncated
|
||||
</DrawingGroup>
|
||||
</DrawingGroup>
|
||||
<DrawingGroup>
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="F1 M640,640z M0,0z M257.4,242.79C257.4,184.17 257.4,151.59 257.4,145.08 257.4,139.73 253.07,135.4 247.72,135.4 242.37,135.4 238.03,139.73 238.03,145.08 238.03,155.25 238.03,236.6 238.03,246.76 238.04,249.31 239.05,251.74 240.84,253.54 250.36,263.23 326.52,340.7 336.04,350.39 339.78,354.21 345.92,354.28 349.74,350.53 353.57,346.79 353.63,340.65 349.89,336.83 337.55,324.29 306.73,292.95 257.4,242.79z" />
|
||||
<DrawingGroup>
|
||||
<GeometryDrawing Geometry="F1 M640,640z M0,0z M257.4,242.79C257.4,184.17 257.4,151.59 257.4,145.08 257.4,139.73 253.07,135.4 247.72,135.4 242.37,135.4 238.03,139.73 238.03,145.08 238.03,155.25 238.03,236.6 238.03,246.76 238.04,249.31 239.05,251.74 240.84,253.54 250.36,263.23 326.52,340.7 336.04,350.39 339.78,354.21 345.92,354.28 349.74,350.53 353.57,346.79 353.63,340.65 349.89,336.83 337.55,324.29 306.73,292.95 257.4,242.79z"/>
|
||||
</DrawingGroup>
|
||||
</DrawingGroup>
|
||||
</DrawingGroup>
|
||||
</DrawingGroup>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
<DrawingImage x:Key="MarkDrawingImage">
|
||||
<DrawingImage.Drawing>
|
||||
<DrawingGroup>
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="F1 M455,455.91352z M0,0z M357.292969,325.636719L319.042969,363.886719C298.328125,384.601562 298.308594,419.585938 318.984375,440.328125 340.488281,461.078125 374.816406,461.117188 395.542969,440.386719 416.273438,419.660156 416.277344,384.621094 395.542969,363.886719z M357.292969,325.636719" />
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="F1 M455,455.91352z M0,0z M193.402344,115.476562L193.402344,185.355469C210.269531,195.351562 218.160156,215.546875 212.535156,234.328125 206.914062,253.109375 189.222656,265.648438 169.640625,264.730469 150.054688,263.8125 133.617188,249.675781 129.773438,230.449219 125.933594,211.226562 135.675781,191.855469 153.402344,183.480469L153.402344,87.441406 103.46875,137.378906 93.46875,147.378906 93.46875,54.96875C93.46875,35.65625 109.125,20 128.4375,20 147.75,20 163.402344,35.65625 163.402344,54.96875L163.402344,188.867188 183.402344,188.867188 183.402344,54.96875C183.402344,24.609375 158.792969,-2.8421709430404E-14 128.4375,-2.8421709430404E-14 98.078125,-2.8421709430404E-14 73.46875,24.609375 73.46875,54.96875L73.46875,167.378906 17.238281,223.605469C-5.136719,245.980469,-5.136719,282.261719,17.238281,304.636719L89.675781,377.070312C112.066406,399.410156,148.3125,399.410156,170.703125,377.070312L312.847656,234.925781z M193.402344,115.476562" />
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="F1 M455,455.91352z M0,0z M148.945312,222.074219C148.945312,234.609375 159.109375,244.773438 171.644531,244.773438 184.179688,244.773438 194.34375,234.613281 194.347656,222.078125 194.347656,209.542969 184.1875,199.375 171.652344,199.375 159.121094,199.386719 148.964844,209.542969 148.945312,222.074219z M148.945312,222.074219" />
|
||||
</DrawingGroup>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
<DrawingImage x:Key="CopyDrawingImage">
|
||||
<DrawingImage.Drawing>
|
||||
<DrawingGroup>
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="F1 M680,680.55403z M0,0z M217.28125,158.050781L198.539062,158.050781 198.539062,139.308594 217.28125,139.308594z M186.039062,158.050781L167.292969,158.050781 167.292969,139.308594 186.039062,139.308594z M186.039062,158.050781" />
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="F1 M680,680.55403z M0,0z M273.585938,148.683594L273.585938,217.335938 342.242188,217.335938 342.242188,198.589844 292.332031,198.589844 292.332031,148.683594z M273.585938,148.683594" />
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="F1 M680,680.55403z M0,0z M-4.519531,101.820312L-4.519531,638.101562 389.097656,638.101562 389.097656,204.078125 286.839844,101.820312z M370.351562,619.359375L14.222656,619.359375 14.222656,120.566406 279.074219,120.566406 370.351562,211.84375z M370.351562,619.359375" />
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="F1 M680,680.55403z M0,0z M67.332031,226.558594L213.113281,226.558594 213.113281,245.300781 67.332031,245.300781z M67.332031,226.558594" />
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="F1 M680,680.55403z M0,0z M98.570312,289.035156L317.246094,289.035156 317.246094,307.777344 98.570312,307.777344z M98.570312,289.035156" />
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="F1 M680,680.55403z M0,0z M67.332031,335.945312L317.246094,335.945312 317.246094,354.6875 67.332031,354.6875z M67.332031,335.945312" />
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="F1 M680,680.55403z M0,0z M67.332031,382.859375L286.007812,382.859375 286.007812,401.601562 67.332031,401.601562z M67.332031,382.859375" />
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="F1 M680,680.55403z M0,0z M98.570312,429.765625L317.246094,429.765625 317.246094,448.511719 98.570312,448.511719z M98.570312,429.765625" />
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="F1 M680,680.55403z M0,0z M67.332031,476.675781L317.246094,476.675781 317.246094,495.417969 67.332031,495.417969z M67.332031,476.675781" />
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="F1 M680,680.55403z M0,0z M67.332031,523.585938L286.007812,523.585938 286.007812,542.328125 67.332031,542.328125z M67.332031,523.585938" />
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="F1 M680,680.55403z M0,0z M375.324219,46.945312L375.324219,115.59375 443.976562,115.59375 443.976562,96.851562 394.066406,96.851562 394.066406,46.945312z M375.324219,46.945312" />
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="F1 M680,680.55403z M0,0z M388.578125,0.0820312L97.214844,0.0820312 97.214844,76.203125 115.960938,76.203125 115.960938,18.828125 380.816406,18.828125 472.09375,110.105469 472.09375,517.621094 414.714844,517.621094 414.714844,536.363281 490.835938,536.363281 490.835938,102.34375z M388.578125,0.0820312" />
|
||||
</DrawingGroup>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
<DrawingImage x:Key="MatchWordDrawingImage">
|
||||
<DrawingImage.Drawing>
|
||||
<DrawingGroup>
|
||||
<DrawingGroup>
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="F1 M512,512z M0,0z M497,90C505.291,90,512,83.291,512,75L512,15C512,6.709,505.291,0,497,0L437,0C428.709,0,422,6.709,422,15L422,30 90,30 90,15C90,6.599,83.401,0,75,0L15,0C6.599,0,0,6.599,0,15L0,75C0,83.399,6.599,90,15,90L30,90 30,422 15,422C6.709,422,0,428.709,0,437L0,497C0,505.291,6.709,512,15,512L75,512C83.291,512,90,505.291,90,497L90,482 422,482 422,497C422,505.399,428.599,512,437,512L497,512C505.401,512,512,505.399,512,497L512,437C512,428.599,505.401,422,497,422L482,422 482,90 497,90z M452,422L437,422C428.599,422,422,428.599,422,437L422,452 90,452 90,437C90,428.709,83.291,422,75,422L60,422 60,90 75,90C83.401,90,90,83.399,90,75L90,60 422,60 422,75C422,83.291,428.709,90,437,90L452,90 452,422z" />
|
||||
</DrawingGroup>
|
||||
<DrawingGroup>
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="F1 M512,512z M0,0z M361,105L151,105C142.709,105,136,111.709,136,120L136,180C136,186.064 139.647,191.543 145.258,193.857 150.883,196.186 157.314,194.897 161.606,190.605L187.211,165 226,165 226,341.459 198.52,383.68C195.458,388.28 195.166,394.198 197.773,399.076 200.38,403.954 205.463,407 211,407L301,407C306.537,407 311.62,403.953 314.228,399.075 316.836,394.197 316.542,388.279 313.481,383.679L286,341.459 286,165 324.789,165 350.394,190.605C354.701,194.912 361.175,196.201 366.742,193.857 372.352,191.543 376,186.064 376,180L376,120C376,111.709,369.291,105,361,105z" />
|
||||
</DrawingGroup>
|
||||
</DrawingGroup>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
<DrawingImage x:Key="PauseReadingFromFileImage">
|
||||
<DrawingImage.Drawing>
|
||||
<DrawingGroup>
|
||||
<DrawingGroup>
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="F1 M300.003,300.003z M0,0z M150.001,0C67.163,0 0.00100000000000477,67.159 0.00100000000000477,150 0.00100000000000477,232.838 67.163,300.003 150.001,300.003 232.844,300.003 300.001,232.838 300.001,150 300.001,67.159 232.846,0 150.001,0z M134.41,194.538C134.41,204.036 126.71,211.736 117.212,211.736 107.714,211.736 100.014,204.036 100.014,194.538L100.014,105.46C100.014,95.962 107.714,88.262 117.212,88.262 126.71,88.262 134.41,95.962 134.41,105.46L134.41,194.538z M198.955,194.538C198.955,204.036 191.254,211.736 181.757,211.736 172.259,211.736 164.559,204.036 164.559,194.538L164.559,105.46C164.559,95.962 172.259,88.262 181.757,88.262 191.255,88.262 198.955,95.962 198.955,105.46L198.955,194.538z" />
|
||||
</DrawingGroup>
|
||||
<DrawingGroup Transform="0.19241916,0,0,0.21444684,9.596859,102.34478">
|
||||
<DrawingGroup>
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="F1 M300.003,300.003z M0,0z M396.283,130.188C392.477,121.053,387.912,113.823,382.58,108.493L293.502,19.412C288.17,14.087 280.942,9.517 271.805,5.708 262.672,1.903 254.297,0 246.687,0L63.953,0C56.341,0 49.869,2.663 44.54,7.993 39.21,13.32 36.546,19.792 36.546,27.407L36.546,411.126C36.546,418.743 39.21,425.215 44.54,430.543 49.87,435.868 56.341,438.534 63.954,438.534L374.587,438.534C382.198,438.534 388.666,435.868 393.994,430.543 399.322,425.211 401.988,418.743 401.988,411.126L401.988,155.313C401.991,147.699,400.088,139.323,396.283,130.188z M255.816,38.826C261.333,40.729,265.234,42.825,267.52,45.106L356.886,134.472C359.165,136.758,361.26,140.658,363.162,146.178L255.816,146.178z M365.449,401.991L73.089,401.991 73.089,36.545 219.267,36.545 219.267,155.316C219.267,162.93 221.929,169.4 227.259,174.73 232.591,180.057 239.059,182.724 246.676,182.724L365.449,182.724z" />
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="F1 M300.003,300.003z M0,0z M319.77,292.355L118.77,292.355C116.107,292.355 113.917,293.21 112.203,294.921 110.494,296.632 109.635,298.822 109.635,301.484L109.635,319.758C109.635,322.428 110.491,324.617 112.203,326.328 113.918,328.039 116.108,328.895 118.77,328.895L319.77,328.895C322.433,328.895 324.624,328.039 326.334,326.328 328.044,324.617 328.9,322.428 328.9,319.758L328.9,301.484C328.9,298.822 328.045,296.631 326.334,294.921 324.619,293.214 322.429,292.355 319.77,292.355z" />
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="F1 M300.003,300.003z M0,0z M112.202,221.831C110.493,223.543,109.634,225.732,109.634,228.402L109.634,246.673C109.634,249.339 110.49,251.529 112.202,253.24 113.917,254.951 116.107,255.806 118.769,255.806L319.769,255.806C322.432,255.806 324.623,254.951 326.333,253.24 328.043,251.529 328.899,249.339 328.899,246.673L328.899,228.402C328.899,225.739 328.044,223.548 326.333,221.831 324.618,220.122 322.428,219.267 319.769,219.267L118.769,219.267C116.107,219.267,113.917,220.122,112.202,221.831z" />
|
||||
</DrawingGroup>
|
||||
</DrawingGroup>
|
||||
<GeometryDrawing Brush="#FFFFFFFF" Geometry="F1 M300.003,300.003z M0,0z M18.622219,194.28659L17.190961,192.52266 17.190961,149.05813C17.190961,107.9183 17.255361,105.52613 18.394739,104.33228 19.459853,103.21626 21.926698,103.07097 39.809227,103.07097 56.444831,103.07097 60.445513,103.27685 62.42584,104.23484 63.878098,104.9374 68.933324,110.14847 75.179342,117.38155 85.028392,128.78702 85.561622,129.55895 86.246572,133.40305 87.194627,138.72382 87.225147,189.06564 86.282122,191.93759 84.913377,196.10573 85.806624,196.00013 51.699696,196.02626L20.053546,196.05066z M80.38361,165.18435L80.38361,141.17733 67.846812,141.17733C51.02921,141.17733,52.078558,142.34155,52.078558,123.68305L52.078558,109.93013 37.596916,109.93013 23.115273,109.93013 23.115273,149.05265C23.115273,170.57004 23.312745,188.40381 23.554103,188.68325 23.795473,188.9627 36.680846,189.19134 52.188279,189.19134L80.38361,189.19134z M79.742679,133.36552C79.764939,132.13953 60.620508,110.69224 59.503846,110.69224 58.855308,110.69224 58.661133,113.41419 58.661133,122.50524L58.661133,134.3182 69.193242,134.3182C77.170849,134.3182,79.729551,134.08713,79.742679,133.36552z" />
|
||||
<GeometryDrawing Brush="#FFFFFFFF" Geometry="F1 M300.003,300.003z M0,0z M31.791616,156.52117C31.247498,156.1217,31.001705,154.7743,31.133364,152.91274L31.343483,149.94179 51.749438,149.94179 72.155391,149.94179 72.36551,152.91274C72.49717,154.7743 72.251365,156.1217 71.707258,156.52117 70.573492,157.35348 32.925382,157.35348 31.791616,156.52117z" />
|
||||
<GeometryDrawing Brush="#FFFFFFFF" Geometry="F1 M300.003,300.003z M0,0z M31.277389,171.35678C31.078721,170.75736,31.012322,169.29482,31.129822,168.10669L31.343483,165.94648 51.952318,165.745 72.56114,165.54355 72.35826,168.79352 72.155391,172.04348 51.897004,172.24506C34.823474,172.41495,31.581815,172.27526,31.277389,171.35678z" />
|
||||
</DrawingGroup>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
<DrawingImage x:Key="StartReadFromFileImage">
|
||||
<DrawingImage.Drawing>
|
||||
<DrawingGroup>
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="F1 M350,350z M0,0z M175,0C78.343,0 0,78.343 0,175 0,271.656 78.343,350 175,350 271.656,350 350,271.656 350,175 350,78.343 271.656,0 175,0z M258.738,189.05L154.352,260.862C151.448,262.851 148.068,263.868 144.679,263.868 141.951,263.868 139.243,263.22 136.749,261.917 131.144,258.952 127.624,253.14 127.624,246.814L127.624,103.188C127.624,96.862 131.144,91.049 136.749,88.084 142.354,85.144 149.126,85.549 154.352,89.139L258.738,160.95C263.357,164.13 266.125,169.391 266.125,175 266.125,180.609 263.358,185.87 258.738,189.05z" />
|
||||
<DrawingGroup Transform="0.22487336,0,0,0.249232,16.687894,118.12706">
|
||||
<DrawingGroup>
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="F1 M350,350z M0,0z M396.283,130.188C392.477,121.053,387.912,113.823,382.58,108.493L293.502,19.412C288.17,14.087 280.942,9.517 271.805,5.708 262.672,1.903 254.297,0 246.687,0L63.953,0C56.341,0 49.869,2.663 44.54,7.993 39.21,13.32 36.546,19.792 36.546,27.407L36.546,411.126C36.546,418.743 39.21,425.215 44.54,430.543 49.87,435.868 56.341,438.534 63.954,438.534L374.587,438.534C382.198,438.534 388.666,435.868 393.994,430.543 399.322,425.211 401.988,418.743 401.988,411.126L401.988,155.313C401.991,147.699,400.088,139.323,396.283,130.188z M255.816,38.826C261.333,40.729,265.234,42.825,267.52,45.106L356.886,134.472C359.165,136.758,361.26,140.658,363.162,146.178L255.816,146.178z M365.449,401.991L73.089,401.991 73.089,36.545 219.267,36.545 219.267,155.316C219.267,162.93 221.929,169.4 227.259,174.73 232.591,180.057 239.059,182.724 246.676,182.724L365.449,182.724z" />
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="F1 M350,350z M0,0z M319.77,292.355L118.77,292.355C116.107,292.355 113.917,293.21 112.203,294.921 110.494,296.632 109.635,298.822 109.635,301.484L109.635,319.758C109.635,322.428 110.491,324.617 112.203,326.328 113.918,328.039 116.108,328.895 118.77,328.895L319.77,328.895C322.433,328.895 324.624,328.039 326.334,326.328 328.044,324.617 328.9,322.428 328.9,319.758L328.9,301.484C328.9,298.822 328.045,296.631 326.334,294.921 324.619,293.214 322.429,292.355 319.77,292.355z" />
|
||||
<GeometryDrawing Brush="{Binding Path=IconColor}" Geometry="F1 M350,350z M0,0z M112.202,221.831C110.493,223.543,109.634,225.732,109.634,228.402L109.634,246.673C109.634,249.339 110.49,251.529 112.202,253.24 113.917,254.951 116.107,255.806 118.769,255.806L319.769,255.806C322.432,255.806 324.623,254.951 326.333,253.24 328.043,251.529 328.899,249.339 328.899,246.673L328.899,228.402C328.899,225.739 328.044,223.548 326.333,221.831 324.618,220.122 322.428,219.267 319.769,219.267L118.769,219.267C116.107,219.267,113.917,220.122,112.202,221.831z" />
|
||||
</DrawingGroup>
|
||||
</DrawingGroup>
|
||||
<GeometryDrawing Brush="#FFFFFFFF" Geometry="F1 M350,350z M0,0z M27.235508,224.98263L25.562848,222.93258 25.562848,172.41772C25.562848,124.60465 25.638118,121.82445 26.96966,120.43695 28.214421,119.1399 31.097334,118.97104 51.996005,118.97104 71.437438,118.97104 76.112891,119.21031 78.427228,120.3237 80.12443,121.14022 86.032291,127.19658 93.331789,135.60291 104.84202,148.85846 105.46519,149.75559 106.26566,154.22324 107.37362,160.40709 107.40929,218.91481 106.30726,222.2526 104.70765,227.09685 105.75156,226.97412 65.892015,227.00448L28.908296,227.03278z M99.413829,191.15974L99.413829,163.25859 84.762523,163.25859C65.108395,163.25859,66.33473,164.61165,66.33473,142.92658L66.33473,126.94281 49.410555,126.94281 32.486379,126.94281 32.486379,172.41135C32.486379,197.41905 32.717156,218.14561 32.999224,218.47038 33.281304,218.79516 48.339977,219.06089 66.462959,219.06089L99.413829,219.06089z M98.664797,154.17963C98.690817,152.75477 76.317401,127.82854 75.012399,127.82854 74.254476,127.82854 74.02755,130.99202 74.02755,141.55771L74.02755,155.28684 86.336047,155.28684C95.65919,155.28684,98.649454,155.01828,98.664797,154.17963z" />
|
||||
<GeometryDrawing Brush="#FFFFFFFF" Geometry="F1 M350,350z M0,0z M42.62611,181.09133C41.990219,180.62706,41.702969,179.06111,41.856834,176.89758L42.102393,173.44471 65.950099,173.44471 89.797805,173.44471 90.043363,176.89758C90.19723,179.06111 89.909966,180.62706 89.274089,181.09133 87.949097,182.05865 43.951101,182.05865 42.62611,181.09133z" />
|
||||
<GeometryDrawing Brush="#FFFFFFFF" Geometry="F1 M350,350z M0,0z M42.025151,198.33341C41.792975,197.63675,41.715377,195.93698,41.852694,194.55612L42.102393,192.0455 66.187199,191.81135 90.27199,191.57722 90.03489,195.35436 89.797805,199.13149 66.122556,199.36577C46.169333,199.56321,42.380923,199.40087,42.025151,198.33341z" />
|
||||
</DrawingGroup>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
|
||||
<DrawingImage x:Key="RegularExpressionsImage">
|
||||
<DrawingImage.Drawing>
|
||||
<DrawingGroup>
|
||||
<DrawingGroup>
|
||||
<GeometryDrawing Brush="Transparent">
|
||||
<GeometryDrawing.Geometry>
|
||||
<RectangleGeometry RadiusX="0" RadiusY="0" Rect="-1,-1,402,402" />
|
||||
</GeometryDrawing.Geometry>
|
||||
</GeometryDrawing>
|
||||
</DrawingGroup>
|
||||
<DrawingGroup>
|
||||
<DrawingGroup>
|
||||
<GlyphRunDrawing ForegroundBrush="{Binding IconColor}">
|
||||
<GlyphRunDrawing.GlyphRun>
|
||||
<GlyphRun PixelsPerDip="1" BaselineOrigin="31.5,260.4375" FontRenderingEmSize="250" BidiLevel="0" IsSideways="False" CaretStops="1 1 1 1 1" ClusterMap="0 1 2 3" Characters="(.*)" GlyphIndices="11 17 13 12" AdvanceWidths="83.2533333333333 69.4566666666667 97.29 83.2533333333333" GlyphOffsets="0,0 0,0 0,0 0,0" Language="en-us">
|
||||
<GlyphRun.GlyphTypeface>
|
||||
<GlyphTypeface FontUri="C:\WINDOWS\FONTS\ARIAL.TTF" StyleSimulations="None" />
|
||||
</GlyphRun.GlyphTypeface>
|
||||
</GlyphRun>
|
||||
</GlyphRunDrawing.GlyphRun>
|
||||
</GlyphRunDrawing>
|
||||
</DrawingGroup>
|
||||
</DrawingGroup>
|
||||
</DrawingGroup>
|
||||
</DrawingImage.Drawing>
|
||||
</DrawingImage>
|
||||
</ResourceDictionary>
|
||||
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,67 @@
|
||||
//******************************************************************************//
|
||||
// IPValidation.cs
|
||||
// 12/4/2023
|
||||
//
|
||||
// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
// PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
// AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
// UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
// RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
// CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
// OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
// COMPANY.
|
||||
//
|
||||
// THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
//
|
||||
// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
//
|
||||
// WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
// EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
// BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
// 120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
// 730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
// OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
// LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
// BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
// APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
// PENALTIES.
|
||||
//
|
||||
// DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
// FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
// INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
// DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
// RECONSTRUCTION OF THE DOCUMENT.
|
||||
// POC: Alex Kravchenko (1118268)
|
||||
//******************************************************************************//
|
||||
|
||||
// Ignore Spelling: Validators
|
||||
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using System.Windows.Controls;
|
||||
|
||||
namespace Raytheon.LogDashboard.Validators
|
||||
{
|
||||
public class IPValidation : ValidationRule
|
||||
{
|
||||
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
|
||||
{
|
||||
if(value is string str && ValidateIPv4(str))
|
||||
{
|
||||
return new ValidationResult(true, null);
|
||||
}
|
||||
return new ValidationResult(false, "Invalid IP Address!");
|
||||
}
|
||||
|
||||
private bool ValidateIPv4(string ipString)
|
||||
{
|
||||
if(ipString.Count(c => c == '.') != 3)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return IPAddress.TryParse(ipString, out IPAddress address);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,83 @@
|
||||
//******************************************************************************//
|
||||
// PortNumberValidation.cs
|
||||
// 12/4/2023
|
||||
//
|
||||
// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
// PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
// AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
// UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
// RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
// CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
// OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
// COMPANY.
|
||||
//
|
||||
// THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
//
|
||||
// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
//
|
||||
// WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
// EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
// BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
// 120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
// 730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
// OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
// LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
// BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
// APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
// PENALTIES.
|
||||
//
|
||||
// DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
// FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
// INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
// DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
// RECONSTRUCTION OF THE DOCUMENT.
|
||||
// POC: Alex Kravchenko (1118268)
|
||||
//******************************************************************************//
|
||||
|
||||
// Ignore Spelling: Validators
|
||||
|
||||
using System;
|
||||
using System.Globalization;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Windows.Controls;
|
||||
|
||||
namespace Raytheon.LogDashboard.Validators
|
||||
{
|
||||
public class PortNumberValidation : ValidationRule
|
||||
{
|
||||
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
|
||||
{
|
||||
if(value is string str && IsPort(str))
|
||||
{
|
||||
return new ValidationResult(true, null);
|
||||
}
|
||||
return new ValidationResult(false, "Invalid port number!");
|
||||
}
|
||||
|
||||
private bool IsPort(string value)
|
||||
{
|
||||
if(string.IsNullOrEmpty(value))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
Regex numeric = new Regex(@"^[0-9]+$", RegexOptions.Compiled | RegexOptions.IgnoreCase);
|
||||
|
||||
if(numeric.IsMatch(value))
|
||||
{
|
||||
try
|
||||
{
|
||||
if(Convert.ToInt32(value) < 65536)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
catch(OverflowException)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,101 @@
|
||||
<!--
|
||||
ImportLogsProcessDialog.xaml
|
||||
12/4/2023
|
||||
|
||||
RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
COMPANY.
|
||||
|
||||
THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
|
||||
UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
|
||||
WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
PENALTIES.
|
||||
|
||||
DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
RECONSTRUCTION OF THE DOCUMENT.
|
||||
POC: Alex Kravchenko (1118268)
|
||||
-->
|
||||
<mah:MetroWindow x:Class="Raytheon.LogDashboard.View.ImportLogsProcessDialog"
|
||||
xmlns:mah="http://metro.mahapps.com/winfx/xaml/controls"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
DataContext="{Binding ImportLogsProcess, Source={StaticResource LogDashLocator}}"
|
||||
mc:Ignorable="d"
|
||||
Title="Import logs process"
|
||||
Height="320" Width="500"
|
||||
>
|
||||
|
||||
<mah:MetroWindow.Resources>
|
||||
<ResourceDictionary>
|
||||
<ResourceDictionary.MergedDictionaries>
|
||||
<ResourceDictionary Source="../Styles/Styles.xaml"/>
|
||||
</ResourceDictionary.MergedDictionaries>
|
||||
</ResourceDictionary>
|
||||
</mah:MetroWindow.Resources>
|
||||
|
||||
<Grid>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="*"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled">
|
||||
<ItemsControl Margin="10" ItemsSource="{Binding ImportFiles, UpdateSourceTrigger=PropertyChanged}">
|
||||
<ItemsControl.ItemTemplate>
|
||||
<DataTemplate>
|
||||
<StackPanel Orientation="Vertical">
|
||||
<TextBlock Text="{Binding Path=FilePath}" Margin="0,10,0,5"/>
|
||||
<Grid>
|
||||
<ProgressBar Value="{Binding Path=Process, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
||||
Background="{Binding LogDashboard.SelectedColorTheme.Color, Source={StaticResource LogDashLocator}}"
|
||||
Height="20" />
|
||||
<TextBlock Text="{Binding Path=Process, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, StringFormat={}{0}%}"
|
||||
HorizontalAlignment="Center"
|
||||
VerticalAlignment="Center"/>
|
||||
</Grid>
|
||||
</StackPanel>
|
||||
</DataTemplate>
|
||||
</ItemsControl.ItemTemplate>
|
||||
</ItemsControl>
|
||||
</ScrollViewer>
|
||||
|
||||
<StackPanel Grid.Row="1"
|
||||
Orientation="Horizontal"
|
||||
HorizontalAlignment="Right">
|
||||
|
||||
<Button Content="Ok"
|
||||
Command="{Binding CloseCommand}"
|
||||
CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type mah:MetroWindow}}}"
|
||||
IsDefault="True"
|
||||
Height="30"
|
||||
Background="{Binding LogDashboard.SelectedColorTheme.Color, Source={StaticResource LogDashLocator}}"
|
||||
Margin="0,0,10,0" />
|
||||
|
||||
<Button Content="Cancel"
|
||||
Command="{Binding CancelCommand}"
|
||||
CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type mah:MetroWindow}}}"
|
||||
Background="{Binding LogDashboard.SelectedColorTheme.Color, Source={StaticResource LogDashLocator}}"
|
||||
/>
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
</mah:MetroWindow>
|
||||
@@ -0,0 +1,51 @@
|
||||
//******************************************************************************//
|
||||
// ImportLogsProcessDialog.xaml.cs
|
||||
// 12/4/2023
|
||||
//
|
||||
// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
// PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
// AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
// UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
// RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
// CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
// OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
// COMPANY.
|
||||
//
|
||||
// THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
//
|
||||
// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
//
|
||||
// WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
// EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
// BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
// 120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
// 730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
// OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
// LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
// BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
// APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
// PENALTIES.
|
||||
//
|
||||
// DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
// FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
// INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
// DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
// RECONSTRUCTION OF THE DOCUMENT.
|
||||
// POC: Alex Kravchenko (1118268)
|
||||
//******************************************************************************//
|
||||
|
||||
using Raytheon.LogDashboard.ViewModel;
|
||||
|
||||
namespace Raytheon.LogDashboard.View
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for ImportFilesProcessDialog.xaml
|
||||
/// </summary>
|
||||
public partial class ImportLogsProcessDialog
|
||||
{
|
||||
public ImportLogsProcessDialog()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,317 @@
|
||||
<!--
|
||||
LogDashboardCtrl.xaml
|
||||
12/4/2023
|
||||
|
||||
RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
COMPANY.
|
||||
|
||||
THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
|
||||
UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
|
||||
WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
PENALTIES.
|
||||
|
||||
DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
RECONSTRUCTION OF THE DOCUMENT.
|
||||
POC: Alex Kravchenko (1118268)
|
||||
-->
|
||||
<mah:MetroContentControl x:Class="Raytheon.LogDashboard.View.LogDashboardCtrl"
|
||||
xmlns:mah="http://metro.mahapps.com/winfx/xaml/controls"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
DataContext="{Binding LogDashboard, Source={StaticResource LogDashLocator}}"
|
||||
mc:Ignorable="d"
|
||||
Loaded="MetroContentControl_Loaded"
|
||||
>
|
||||
|
||||
<mah:MetroContentControl.Resources>
|
||||
<ResourceDictionary>
|
||||
<ResourceDictionary.MergedDictionaries>
|
||||
<ResourceDictionary Source="../Styles/Styles.xaml"/>
|
||||
</ResourceDictionary.MergedDictionaries>
|
||||
</ResourceDictionary>
|
||||
</mah:MetroContentControl.Resources>
|
||||
|
||||
<mah:MetroContentControl.InputBindings>
|
||||
<KeyBinding Command="{Binding Path=SearchLogCommand}" CommandParameter="{StaticResource False}" Modifiers="Control" Key="F"/>
|
||||
<KeyBinding Command="{Binding Path=SearchLogCommand}" CommandParameter="{StaticResource True}" Modifiers="Control+Shift" Key="F"/>
|
||||
<KeyBinding Command="{Binding Path=FindNextCommand}" Modifiers="Control" Key="N"/>
|
||||
<KeyBinding Command="{Binding Path=FindPreviousCommand}" Modifiers="Control" Key="P"/>
|
||||
<KeyBinding Command="{Binding Path=ClearSearchResultCommand}" Modifiers="Control" Key="C"/>
|
||||
<KeyBinding Command="{Binding Path=ExportCommand}" Modifiers="Control" Key="S"/>
|
||||
<KeyBinding Command="{Binding Path=CleanCommand}" Modifiers="Control" Key="R"/>
|
||||
<KeyBinding Command="{Binding Path=GoToTimestampCommand}" Modifiers="Control" Key="T"/>
|
||||
<KeyBinding Command="{Binding Path=SetTimeIntervalCommand}" Modifiers="Control+Shift" Key="T"/>
|
||||
</mah:MetroContentControl.InputBindings>
|
||||
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="0.8*"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="40"/>
|
||||
<RowDefinition Height="0.85*"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="225"/>
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<Grid Grid.ColumnSpan="3" Margin="5">
|
||||
<StackPanel Orientation="Horizontal" Grid.ColumnSpan="3" HorizontalAlignment="Left">
|
||||
<Button Style="{StaticResource ImportButtonStyleCircle}" Command="{Binding Path=ImportCommand}"/>
|
||||
<Button Style="{StaticResource ExportButtonStyleCircle}" Command="{Binding Path=ExportCommand}"/>
|
||||
</StackPanel>
|
||||
|
||||
<StackPanel Orientation="Horizontal" Grid.ColumnSpan="3" HorizontalAlignment="Center">
|
||||
<Button Style="{StaticResource StartPauseNetworkReceiverButtonStyle}"/>
|
||||
<Button Style="{StaticResource StartPauseFileReceiverButtonStyle}" Visibility="{Binding Path=FileWatchers.Count, Converter={StaticResource CountToVisibilityConverter}}"/>
|
||||
<Button Style="{StaticResource ScrollToTop}" Click="OnScrollToTopButtonClick"/>
|
||||
<Button Style="{StaticResource AutoScrollToBottom}" Click="OnAutoScrollToBottomButtonClick" x:Name="AutoScrollButton"/>
|
||||
<Button Style="{StaticResource ScrollToBottom}" Click="OnScrollToBottomButtonClick"/>
|
||||
|
||||
<Button Padding="2" HorizontalAlignment="Right"
|
||||
Style="{StaticResource CircleImageButtonStyle}"
|
||||
ToolTip="Clear / Reset All (Ctrl+R)"
|
||||
Command="{Binding ElementName=LogsListView, Path=DataContext.CleanCommand}"
|
||||
IsEnabled="{Binding ElementName=LogsListView, Path= DataContext.CleanIsEnabled}"
|
||||
Margin="10,0">
|
||||
<Image Source="{StaticResource CleanWhiteImage}"/>
|
||||
</Button>
|
||||
|
||||
|
||||
</StackPanel>
|
||||
|
||||
<Button Style="{StaticResource SettingsButtonStyle}" Command="{Binding Path=OpenSettingsCommand}"/>
|
||||
</Grid>
|
||||
|
||||
|
||||
<Separator Grid.Row="0" Grid.ColumnSpan="3" Grid.Column="0" VerticalAlignment="Bottom" Margin="0"/>
|
||||
|
||||
<Grid Grid.Row="1" Grid.Column="2" Grid.RowSpan="3">
|
||||
<Button Style="{StaticResource TreeButtonStyle}" Command="{Binding Path=OpenTreeCommand}" />
|
||||
</Grid>
|
||||
|
||||
<GridSplitter Grid.Column="1" Width="2" Grid.Row="1" Grid.RowSpan="3"
|
||||
ResizeBehavior="PreviousAndNext"
|
||||
ResizeDirection="Columns"
|
||||
Background="Gray"
|
||||
VerticalAlignment="Stretch"
|
||||
HorizontalAlignment="Center"/>
|
||||
|
||||
<GridSplitter Grid.Column="0" Grid.ColumnSpan="2" Height="3" Grid.Row="2"
|
||||
ResizeBehavior="PreviousAndNext"
|
||||
ResizeDirection="Rows"
|
||||
Background="Gray"
|
||||
HorizontalAlignment="Stretch"/>
|
||||
|
||||
<ListView Grid.Column="0" Grid.Row="1"
|
||||
ItemsSource="{Binding Path=Logs, IsAsync=True}"
|
||||
SelectedValue="{Binding Path=SelectedLog}"
|
||||
x:Name="LogsListView"
|
||||
ScrollViewer.CanContentScroll="True"
|
||||
ScrollViewer.VerticalScrollBarVisibility="Auto"
|
||||
DragOver="LogsListView_OnDragOver"
|
||||
Drop="LogsListView_OnDrop"
|
||||
AllowDrop="True"
|
||||
ScrollViewer.HorizontalScrollBarVisibility="Disabled"
|
||||
ScrollViewer.ScrollChanged="LogsListView_OnScrollChanged"
|
||||
ItemContainerStyle="{StaticResource LogItemStyle}"
|
||||
SelectionChanged="OnSelectionChanged"
|
||||
VirtualizingStackPanel.IsVirtualizing="True"
|
||||
VirtualizingStackPanel.VirtualizationMode="Recycling"
|
||||
IsEnabled="{Binding Path=IsEnableLogList}"
|
||||
GridViewColumnHeader.Click="GridViewColumnHeaderClickedHandler">
|
||||
<ListView.ItemsPanel>
|
||||
<ItemsPanelTemplate>
|
||||
<VirtualizingStackPanel Orientation="Vertical"/>
|
||||
</ItemsPanelTemplate>
|
||||
</ListView.ItemsPanel>
|
||||
<ListView.View>
|
||||
<GridView>
|
||||
|
||||
<GridViewColumn Width="{Binding Path=ColorReceiverColumnWidth}"
|
||||
HeaderContainerStyle="{StaticResource FixedWithHeaderContainerStyle}"
|
||||
CellTemplate="{StaticResource ReceiverColorColumnDataTemplate}" />
|
||||
|
||||
<GridViewColumn CellTemplate="{StaticResource LogLevelImagesDataTemplate}"
|
||||
Width="90"
|
||||
HeaderContainerStyle="{StaticResource LogLevelHeaderTemplate}"/>
|
||||
|
||||
<GridViewColumn Header="Time"
|
||||
Width="Auto"
|
||||
DisplayMemberBinding="{Binding Time, Converter={StaticResource DataConverter}}"
|
||||
HeaderContainerStyle="{StaticResource BaseGridViewColumnHeaderStyle}"/>
|
||||
|
||||
<GridViewColumn Header="Thread"
|
||||
Width="{Binding Path=ThreadColumnWidth}"
|
||||
DisplayMemberBinding="{Binding Thread}"
|
||||
HeaderContainerStyle="{StaticResource BaseGridViewColumnHeaderStyle}">
|
||||
</GridViewColumn>
|
||||
|
||||
<GridViewColumn Header="Source"
|
||||
Width="{Binding SourceColumnWidth}"
|
||||
DisplayMemberBinding="{Binding Address}"
|
||||
HeaderContainerStyle="{StaticResource IpGridViewColumnHeaderStyle}"/>
|
||||
|
||||
<GridViewColumn Header="Logger"
|
||||
Width="Auto"
|
||||
DisplayMemberBinding="{Binding Logger, Converter={StaticResource LoggerDisplayConverter}}"
|
||||
HeaderContainerStyle="{StaticResource BaseGridViewColumnHeaderStyle}"/>
|
||||
|
||||
<GridViewColumn Header="Message"
|
||||
CellTemplate="{StaticResource LogMessageDataTemplate}"
|
||||
Width="1200"
|
||||
HeaderContainerStyle="{StaticResource MessageHeaderTemplate}"/>
|
||||
</GridView>
|
||||
</ListView.View>
|
||||
<ListView.InputBindings>
|
||||
<KeyBinding Key="W" Modifiers="Control" Command="{Binding Path=FindNextWarningCommand}"/>
|
||||
<KeyBinding Key="E" Modifiers="Control" Command="{Binding Path=FindNextErrorCommand}"/>
|
||||
</ListView.InputBindings>
|
||||
</ListView>
|
||||
|
||||
<mah:ProgressRing Grid.Column="0" Grid.Row="1" Height="50" Width="50"
|
||||
VerticalAlignment="Center" HorizontalAlignment="Center"
|
||||
Visibility="{Binding Path=IsVisibleLoader, Converter={StaticResource BooleanToVisibility}}"/>
|
||||
|
||||
<ProgressBar Grid.Column="0" Grid.Row="1" Height="10"
|
||||
VerticalAlignment="Bottom" Value="{Binding ProcessBarValue}"
|
||||
Background="{Binding SelectedColorTheme.Color}"
|
||||
Foreground="{Binding SelectedColorTheme.Color}"
|
||||
Visibility="{Binding IsVisibleProcessBar, Converter={StaticResource BooleanToVisibility}}" Maximum="100"/>
|
||||
|
||||
|
||||
<GroupBox Grid.Row="3" Padding="0,5" BorderThickness="0" mah:HeaderedControlHelper.HeaderBackground="{Binding Path=IconColor}">
|
||||
<GroupBox.HeaderTemplate>
|
||||
<DataTemplate>
|
||||
<Grid Height="25" Margin="0">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition/>
|
||||
<ColumnDefinition/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<TextBlock Text="Message Details" FontSize="16" Margin="10,0" />
|
||||
<TextBlock Grid.Column="1" Text="Logs Count" VerticalAlignment="Center" HorizontalAlignment="Right" Margin="0,0,5,0" />
|
||||
<TextBlock Grid.Column="2" Text="{Binding Path=DataContext.Logs.Count, RelativeSource={RelativeSource AncestorType=mah:MetroContentControl}}"
|
||||
HorizontalAlignment="Right" VerticalAlignment="Center" Margin="0,0,15,0" />
|
||||
</Grid>
|
||||
</DataTemplate>
|
||||
</GroupBox.HeaderTemplate>
|
||||
|
||||
<Grid Margin="10,10,0,0">
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="*"/>
|
||||
<RowDefinition Height="60"/>
|
||||
</Grid.RowDefinitions>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="80"/>
|
||||
<ColumnDefinition Width="*"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
|
||||
<StackPanel VerticalAlignment="Center">
|
||||
<TextBlock Text="Message" />
|
||||
|
||||
<Button Grid.Row="0" Grid.Column="0"
|
||||
ToolTip="Copy"
|
||||
Command="{Binding Path=CopyMessageCommand}"
|
||||
Style="{StaticResource CircleImageButtonStyle}">
|
||||
<Image Source="{StaticResource CopyDrawingImage}"/>
|
||||
|
||||
</Button>
|
||||
</StackPanel>
|
||||
|
||||
<TextBox x:Name="LoggerTextBox" Grid.Row="0"
|
||||
Text="{Binding Path=SelectedLog.Message}"
|
||||
Grid.Column="1"
|
||||
VerticalAlignment="Stretch" TextWrapping="Wrap" Margin="10,0,20,0"
|
||||
VerticalContentAlignment="Top"
|
||||
HorizontalAlignment="Stretch"
|
||||
Padding="5,0"
|
||||
Height="Auto"
|
||||
IsReadOnly="True"
|
||||
VerticalScrollBarVisibility="Auto"/>
|
||||
|
||||
<Grid Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2" Margin="20,10,10,0">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
|
||||
<TextBlock Text="Logger" />
|
||||
<TextBox Grid.Column="1"
|
||||
Text="{Binding Path=SelectedLog.Logger}"
|
||||
Height="35"
|
||||
Margin="6,0,10,0"
|
||||
BorderThickness="1"
|
||||
VerticalContentAlignment="Center"
|
||||
HorizontalAlignment="Stretch"
|
||||
Padding="5,0"
|
||||
IsReadOnly="True"/>
|
||||
|
||||
<TextBlock Grid.Column="2" Text="Time" HorizontalAlignment="Left"/>
|
||||
<TextBox Text="{Binding Path=SelectedLog.Time, StringFormat={}{0:MM/dd/yyyy HH:mm:ss.fff}}"
|
||||
Grid.Column="3"
|
||||
Height="35"
|
||||
Margin="10,0"
|
||||
Width="180"
|
||||
BorderThickness="1"
|
||||
VerticalContentAlignment="Center"
|
||||
HorizontalAlignment="Left"
|
||||
Padding="5,0"
|
||||
IsReadOnly="True"/>
|
||||
|
||||
<TextBlock Grid.Column="4" Text="Thread" HorizontalAlignment="Right"/>
|
||||
<TextBox Text="{Binding Path=SelectedLog.Thread}"
|
||||
Grid.Column="5"
|
||||
Height="35"
|
||||
Margin="10,0"
|
||||
Width="80"
|
||||
BorderThickness="1"
|
||||
VerticalContentAlignment="Center"
|
||||
HorizontalAlignment="Left" Padding="5,0" IsReadOnly="True"/>
|
||||
|
||||
<TextBlock Grid.Column="6"
|
||||
Text="Port" HorizontalAlignment="Right"/>
|
||||
<TextBox Text="{Binding Path=SelectedLog.Port}"
|
||||
Grid.Column="7"
|
||||
Height="35"
|
||||
Margin="10,0"
|
||||
Width="80"
|
||||
BorderThickness="1"
|
||||
VerticalContentAlignment="Center"
|
||||
HorizontalAlignment="Right"
|
||||
Padding="5,0"
|
||||
IsReadOnly="True"/>
|
||||
</Grid>
|
||||
</Grid>
|
||||
</GroupBox>
|
||||
</Grid>
|
||||
|
||||
</mah:MetroContentControl>
|
||||
@@ -0,0 +1,292 @@
|
||||
//******************************************************************************//
|
||||
// LogDashboardCtrl.xaml.cs
|
||||
// 12/4/2023
|
||||
//
|
||||
// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
// PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
// AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
// UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
// RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
// CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
// OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
// COMPANY.
|
||||
//
|
||||
// THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
//
|
||||
// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
//
|
||||
// WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
// EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
// BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
// 120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
// 730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
// OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
// LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
// BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
// APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
// PENALTIES.
|
||||
//
|
||||
// DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
// FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
// INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
// DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
// RECONSTRUCTION OF THE DOCUMENT.
|
||||
// POC: Alex Kravchenko (1118268)
|
||||
//******************************************************************************//
|
||||
using Raytheon.LogDashboard.ViewModel;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Deployment.Application;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Data;
|
||||
|
||||
namespace Raytheon.LogDashboard.View
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for LogDashboardCtrl.xaml
|
||||
/// </summary>
|
||||
public partial class LogDashboardCtrl
|
||||
{
|
||||
public static IntPtr WindowHandle { get; private set; }
|
||||
|
||||
public LogDashboardCtrl()
|
||||
{
|
||||
InitializeComponent();
|
||||
|
||||
AutoScrollButton.ToolTip = "Enable Auto Scroll";
|
||||
}
|
||||
|
||||
private void MetroContentControl_Loaded(object sender, RoutedEventArgs e)
|
||||
{
|
||||
if (AppDomain.CurrentDomain.SetupInformation.ActivationArguments?.ActivationData != null)
|
||||
{
|
||||
string[] activationData = AppDomain.CurrentDomain.SetupInformation.ActivationArguments.ActivationData;
|
||||
foreach (var arg in activationData.Where(x => x.EndsWith(".txt") || x.EndsWith(".log")))
|
||||
{
|
||||
((LogDashboardViewModel)DataContext).ImportLogs(arg);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
List<string> args = Environment.GetCommandLineArgs().Where(x => x.EndsWith(".txt") || x.EndsWith(".log")).ToList();
|
||||
|
||||
if (args.Any())
|
||||
{
|
||||
((LogDashboardViewModel)DataContext).ImportLogs(args.Where(x => x.EndsWith(".txt") || x.EndsWith(".log")));
|
||||
return;
|
||||
}
|
||||
|
||||
DisplayChangeLog();
|
||||
|
||||
}
|
||||
|
||||
private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
|
||||
{
|
||||
if(AutoScrollEnabled && LogsListView.Items.Count > 0)
|
||||
{
|
||||
AutoScrollEnabled = false;
|
||||
}
|
||||
|
||||
Task.Run(() =>
|
||||
{
|
||||
Application.Current.Dispatcher.Invoke(() =>
|
||||
{
|
||||
LogsListView.ScrollIntoView(LogsListView.SelectedItem);
|
||||
//TODO
|
||||
//LoggersTreeView.BringIntoView();
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
#region Logging scroll
|
||||
|
||||
private bool autoScrollEnabled = true;
|
||||
protected bool AutoScrollEnabled
|
||||
{
|
||||
get => autoScrollEnabled;
|
||||
set
|
||||
{
|
||||
autoScrollEnabled = value;
|
||||
if (autoScrollEnabled)
|
||||
{
|
||||
AutoScrollButton.Opacity = 0.5;
|
||||
AutoScrollButton.ToolTip = "Disable Auto Scroll";
|
||||
}
|
||||
else
|
||||
{
|
||||
AutoScrollButton.ToolTip = "Enable Auto Scroll";
|
||||
AutoScrollButton.Opacity = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void OnScrollToTopButtonClick(object sender, RoutedEventArgs e)
|
||||
{
|
||||
if (LogsListView.Items.Count > 0)
|
||||
{
|
||||
LogsListView.ScrollIntoView(LogsListView.Items[0]);
|
||||
}
|
||||
}
|
||||
|
||||
private void OnAutoScrollToBottomButtonClick(object sender, RoutedEventArgs e)
|
||||
{
|
||||
if (AutoScrollEnabled)
|
||||
{
|
||||
AutoScrollEnabled = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (LogsListView.Items.Count > 0)
|
||||
{
|
||||
LogsListView.ScrollIntoView(LogsListView.Items[LogsListView.Items.Count - 1]);
|
||||
}
|
||||
|
||||
AutoScrollEnabled = true;
|
||||
}
|
||||
}
|
||||
|
||||
private void OnScrollToBottomButtonClick(object sender, RoutedEventArgs e)
|
||||
{
|
||||
if (LogsListView.Items.Count > 0)
|
||||
{
|
||||
LogsListView.ScrollIntoView(LogsListView.Items[LogsListView.Items.Count - 1]);
|
||||
}
|
||||
}
|
||||
|
||||
private void LogsListView_OnScrollChanged(object sender, ScrollChangedEventArgs e)
|
||||
{
|
||||
if (AutoScrollEnabled && LogsListView.Items.Count > 0 && e.VerticalChange < 0)
|
||||
{
|
||||
AutoScrollEnabled = false;
|
||||
}
|
||||
|
||||
if (AutoScrollEnabled && LogsListView.Items.Count > 0)
|
||||
{
|
||||
LogsListView.ScrollIntoView(LogsListView.Items[LogsListView.Items.Count - 1]);
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region table sorting
|
||||
|
||||
GridViewColumnHeader lastHeaderClicked = null;
|
||||
ListSortDirection lastDirection = ListSortDirection.Ascending;
|
||||
|
||||
private void GridViewColumnHeaderClickedHandler(object sender, RoutedEventArgs e)
|
||||
{
|
||||
GridViewColumnHeader headerClicked = e.OriginalSource as GridViewColumnHeader;
|
||||
|
||||
if (headerClicked != null && (string)headerClicked.Content == "Message")
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (headerClicked != null)
|
||||
{
|
||||
if (headerClicked.Role != GridViewColumnHeaderRole.Padding)
|
||||
{
|
||||
ListSortDirection direction;
|
||||
if (headerClicked != lastHeaderClicked)
|
||||
{
|
||||
direction = ListSortDirection.Ascending;
|
||||
}
|
||||
else
|
||||
{
|
||||
direction = lastDirection == ListSortDirection.Ascending
|
||||
? ListSortDirection.Descending
|
||||
: ListSortDirection.Ascending;
|
||||
}
|
||||
|
||||
Binding columnBinding = headerClicked.Column.DisplayMemberBinding as Binding;
|
||||
string sortBy = columnBinding?.Path.Path ?? headerClicked.Column.Header as string;
|
||||
|
||||
Sort(sortBy, direction);
|
||||
|
||||
if (direction == ListSortDirection.Ascending)
|
||||
{
|
||||
headerClicked.Column.HeaderTemplate = Resources["HeaderTemplateArrowUp"] as DataTemplate;
|
||||
}
|
||||
else
|
||||
{
|
||||
headerClicked.Column.HeaderTemplate = Resources["HeaderTemplateArrowDown"] as DataTemplate;
|
||||
}
|
||||
|
||||
// Remove arrow from previously sorted header
|
||||
if (lastHeaderClicked != null && lastHeaderClicked != headerClicked)
|
||||
{
|
||||
lastHeaderClicked.Column.HeaderTemplate = null;
|
||||
}
|
||||
|
||||
lastHeaderClicked = headerClicked;
|
||||
lastDirection = direction;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void Sort(string sortBy, ListSortDirection direction)
|
||||
{
|
||||
ICollectionView dataView = CollectionViewSource.GetDefaultView(LogsListView.ItemsSource);
|
||||
|
||||
dataView.SortDescriptions.Clear();
|
||||
SortDescription sd = new SortDescription(sortBy, direction);
|
||||
dataView.SortDescriptions.Add(sd);
|
||||
dataView.Refresh();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Drag and Drop
|
||||
|
||||
private void LogsListView_OnDragOver(object sender, DragEventArgs e)
|
||||
{
|
||||
string file = ((string[])e.Data.GetData(DataFormats.FileDrop))?.FirstOrDefault(
|
||||
x => Path.GetExtension(x) == ".txt" ||
|
||||
Path.GetExtension(x) == ".log" ||
|
||||
Path.GetExtension(x) == ".csv");
|
||||
|
||||
e.Effects = file != null ? DragDropEffects.Copy : DragDropEffects.None;
|
||||
e.Handled = true;
|
||||
}
|
||||
|
||||
private void LogsListView_OnDrop(object sender, DragEventArgs e)
|
||||
{
|
||||
e.Effects = DragDropEffects.Copy;
|
||||
if (e.Data.GetDataPresent(DataFormats.FileDrop))
|
||||
{
|
||||
string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
|
||||
if (files != null && files.Any())
|
||||
{
|
||||
var logFiles = files.Where(x => Path.GetExtension(x) == ".txt" ||
|
||||
Path.GetExtension(x) == ".log" ||
|
||||
Path.GetExtension(x) == ".csv");
|
||||
if (logFiles.Any())
|
||||
{
|
||||
((LogDashboardViewModel)DataContext).ImportLogs(logFiles);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private void DisplayChangeLog()
|
||||
{
|
||||
if (!ApplicationDeployment.IsNetworkDeployed || !ApplicationDeployment.CurrentDeployment.IsFirstRun)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
ReleaseNotesDialog releaseNotesDialog = new ReleaseNotesDialog
|
||||
{
|
||||
WindowStartupLocation = WindowStartupLocation.CenterOwner
|
||||
};
|
||||
releaseNotesDialog.ShowDialog();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,170 @@
|
||||
<!--
|
||||
LogImportTemplateDialog.xaml
|
||||
12/4/2023
|
||||
|
||||
RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
COMPANY.
|
||||
|
||||
THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
|
||||
UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
|
||||
WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
PENALTIES.
|
||||
|
||||
DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
RECONSTRUCTION OF THE DOCUMENT.
|
||||
POC: Alex Kravchenko (1118268)
|
||||
-->
|
||||
<mah:MetroWindow x:Class="Raytheon.LogDashboard.View.LogImportTemplateDialog"
|
||||
xmlns:mah="http://metro.mahapps.com/winfx/xaml/controls"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
DataContext="{Binding LogImportTemplate, Source={StaticResource LogDashLocator}}"
|
||||
Title="Log Import Template"
|
||||
Topmost="True"
|
||||
mc:Ignorable="d"
|
||||
Height="430"
|
||||
Width="700"
|
||||
Closing="LogImportTemplateDialog_OnClosing">
|
||||
|
||||
<mah:MetroWindow.Resources>
|
||||
<ResourceDictionary>
|
||||
<ResourceDictionary.MergedDictionaries>
|
||||
<ResourceDictionary Source="../Styles/Styles.xaml"/>
|
||||
</ResourceDictionary.MergedDictionaries>
|
||||
</ResourceDictionary>
|
||||
</mah:MetroWindow.Resources>
|
||||
|
||||
<Grid Margin="15,10,15,0">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="Auto" />
|
||||
<ColumnDefinition Width="*" />
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="Auto" />
|
||||
<RowDefinition Height="Auto" />
|
||||
<RowDefinition Height="Auto" />
|
||||
<RowDefinition Height="Auto" />
|
||||
<RowDefinition Height="Auto" />
|
||||
<RowDefinition Height="Auto" />
|
||||
<RowDefinition Height="Auto" />
|
||||
<RowDefinition Height="Auto" />
|
||||
<RowDefinition Height="Auto" />
|
||||
<RowDefinition Height="Auto" />
|
||||
<RowDefinition Height="Auto" />
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<RadioButton Margin="10,10"
|
||||
ToolTip="Try to detect a template for parsing the log file automatically. 100% result is not guaranteed."
|
||||
Content="Automatically"
|
||||
IsChecked="{Binding Path=IsAutomaticDetectTemplateSelected}"/>
|
||||
|
||||
<RadioButton Grid.Row="1" Margin="10,0"
|
||||
Content="Select from existing templates"
|
||||
IsChecked="{Binding Path=IsPopularTemplateSelected}"/>
|
||||
|
||||
<ComboBox Grid.Row="2" Margin="10,0,10,5"
|
||||
Grid.ColumnSpan="2"
|
||||
ItemsSource="{Binding Path=PopularTemplates}"
|
||||
SelectedValue="{Binding Path=SelectedPopularTemplate}"
|
||||
SelectedValuePath="Value"
|
||||
DisplayMemberPath="Key"/>
|
||||
|
||||
<RadioButton Grid.Row="3"
|
||||
Margin="10,0"
|
||||
Content="From layout string"
|
||||
IsChecked="{Binding Path=IsLayoutStringTemplateSelected}"
|
||||
VerticalAlignment="Center" />
|
||||
|
||||
<TextBox Grid.Row="4" Grid.ColumnSpan="2" Margin="10,0,10,5" HorizontalAlignment="Stretch"
|
||||
Text="{Binding TemplateString, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
|
||||
|
||||
<RadioButton Grid.Row="5" Margin="10,0" Content="Or create your own template"
|
||||
IsChecked="{Binding Path=IsUserTemplateSelected}"
|
||||
VerticalAlignment="Center" />
|
||||
|
||||
<Button Grid.Row="6"
|
||||
Width="Auto"
|
||||
Content="Add" Visibility="{Binding Path=ClearContainsIsVisible, Converter={StaticResource BooleanToVisibility}}"
|
||||
Command="{Binding Path=AddTemplateItemCommand}" Margin="10,5,0,0"
|
||||
HorizontalAlignment="Left"/>
|
||||
|
||||
<StackPanel Orientation="Horizontal" Grid.Row="6" Grid.Column="1">
|
||||
<Label Content="{Binding Separator, StringFormat={}{0}:}" VerticalAlignment="Center"/>
|
||||
<TextBox Text="{Binding Path=TemplateSeparator, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" HorizontalContentAlignment="Center" Width="30" VerticalContentAlignment="Center"/>
|
||||
</StackPanel>
|
||||
|
||||
<StackPanel Grid.Row="7" Grid.ColumnSpan="2" Orientation="Horizontal" Margin="10,0,10,5" Height="80">
|
||||
<ItemsControl x:Name="TemplateLogItemsIC" ItemsSource="{Binding Path=TemplateLogItems, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Center" >
|
||||
<ItemsControl.ItemsPanel>
|
||||
<ItemsPanelTemplate>
|
||||
<WrapPanel Orientation="Horizontal" />
|
||||
</ItemsPanelTemplate>
|
||||
</ItemsControl.ItemsPanel>
|
||||
<ItemsControl.ItemTemplate>
|
||||
<DataTemplate>
|
||||
<StackPanel Orientation="Vertical">
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<Label Content="${" VerticalContentAlignment="Center" Padding="0"/>
|
||||
<ComboBox x:Name="ComboBox" Margin="5" ItemsSource="{Binding Path=TemplateItems}" SelectedItem="{Binding Path=SelectedTemplateParameter, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Height="30" VerticalContentAlignment="Center">
|
||||
<ComboBox.GroupStyle>
|
||||
<GroupStyle>
|
||||
<GroupStyle.HeaderTemplate>
|
||||
<DataTemplate>
|
||||
<TextBlock Text="{Binding Name}" Margin="10,0,0,0"/>
|
||||
</DataTemplate>
|
||||
</GroupStyle.HeaderTemplate>
|
||||
</GroupStyle>
|
||||
</ComboBox.GroupStyle>
|
||||
<ComboBox.ItemTemplate>
|
||||
<DataTemplate>
|
||||
<TextBlock Text="{Binding Parameter}"/>
|
||||
</DataTemplate>
|
||||
</ComboBox.ItemTemplate>
|
||||
</ComboBox>
|
||||
<Label Content="}" VerticalContentAlignment="Center" Padding="0"/>
|
||||
<Label Padding="0" FontStyle="Normal" FontSize="18" VerticalContentAlignment="Center" Content="{Binding ElementName=TemplateLogItemsIC, Path=DataContext.TemplateSeparator, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
|
||||
</StackPanel>
|
||||
|
||||
<Button Padding="0"
|
||||
Width="60" Content="Remove"
|
||||
Margin="1" Height="30"
|
||||
ToolTip="Remove Template Item"
|
||||
Command="{Binding ElementName=TemplateLogItemsIC, Path=DataContext.RemoveTemplateItemCommand}" CommandParameter="{Binding}"/>
|
||||
</StackPanel>
|
||||
</DataTemplate>
|
||||
</ItemsControl.ItemTemplate>
|
||||
</ItemsControl>
|
||||
</StackPanel>
|
||||
|
||||
<CheckBox Grid.Row="9" Grid.ColumnSpan="2" Margin="10,0,10,10" Content="Add New Logs When Changing File" IsChecked="{Binding Path=NeedUpdateFile}"/>
|
||||
|
||||
<Button Grid.Row="10" Grid.Column="0" HorizontalAlignment="Left" Margin="10,0" Width="180"
|
||||
Content="Save" Command="{Binding Path=SaveTemplateSettingsCommand}"/>
|
||||
|
||||
<WrapPanel Grid.Row="10" Grid.ColumnSpan="2" HorizontalAlignment="Right" Margin="10,0">
|
||||
<Button Command="{Binding OkCommand}" MinWidth="100" Height="30" Margin="0,0,10,0" Content="OK"/>
|
||||
<Button IsCancel="True" MinWidth="100" Content="Cancel"/>
|
||||
</WrapPanel>
|
||||
</Grid>
|
||||
</mah:MetroWindow>
|
||||
@@ -0,0 +1,66 @@
|
||||
//******************************************************************************//
|
||||
// LogImportTemplateDialog.xaml.cs
|
||||
// 12/4/2023
|
||||
//
|
||||
// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
// PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
// AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
// UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
// RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
// CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
// OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
// COMPANY.
|
||||
//
|
||||
// THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
//
|
||||
// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
//
|
||||
// WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
// EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
// BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
// 120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
// 730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
// OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
// LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
// BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
// APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
// PENALTIES.
|
||||
//
|
||||
// DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
// FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
// INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
// DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
// RECONSTRUCTION OF THE DOCUMENT.
|
||||
// POC: Alex Kravchenko (1118268)
|
||||
//******************************************************************************//
|
||||
using System.ComponentModel;
|
||||
using Raytheon.LogDashboard.Model;
|
||||
using Raytheon.LogDashboard.ViewModel;
|
||||
|
||||
namespace Raytheon.LogDashboard.View
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for LogImportTemplate.xaml
|
||||
/// </summary>
|
||||
public partial class LogImportTemplateDialog
|
||||
{
|
||||
public LogTemplate LogTemplate { get; private set; }
|
||||
public bool NeedUpdateFile { get; private set; } = false;
|
||||
|
||||
public LogImportTemplateDialog()
|
||||
{
|
||||
InitializeComponent();
|
||||
DataContext = new LogImportTemplateViewModel();
|
||||
}
|
||||
|
||||
private void LogImportTemplateDialog_OnClosing(object sender, CancelEventArgs e)
|
||||
{
|
||||
var logImportTemplateViewModel = DataContext as LogImportTemplateViewModel;
|
||||
if (logImportTemplateViewModel != null)
|
||||
{
|
||||
LogTemplate = logImportTemplateViewModel.LogTemplate;
|
||||
NeedUpdateFile = logImportTemplateViewModel.NeedUpdateFile;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,119 @@
|
||||
<!--
|
||||
ReleaseNotesDialog.xaml
|
||||
12/4/2023
|
||||
|
||||
RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
COMPANY.
|
||||
|
||||
THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
|
||||
UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
|
||||
WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
PENALTIES.
|
||||
|
||||
DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
RECONSTRUCTION OF THE DOCUMENT.
|
||||
POC: Alex Kravchenko (1118268)
|
||||
-->
|
||||
<mah:MetroWindow x:Class="Raytheon.LogDashboard.View.ReleaseNotesDialog"
|
||||
xmlns:mah="http://metro.mahapps.com/winfx/xaml/controls"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
DataContext="{Binding ReleaseNotes, Source={StaticResource LogDashLocator}}"
|
||||
WindowTitleBrush="{Binding LogDashboard.SelectedColorTheme.Color, Source={StaticResource LogDashLocator}}"
|
||||
mc:Ignorable="d"
|
||||
Title="Release Notes"
|
||||
Height="600" Width="680">
|
||||
|
||||
<mah:MetroWindow.Resources>
|
||||
<ResourceDictionary>
|
||||
<ResourceDictionary.MergedDictionaries>
|
||||
<ResourceDictionary Source="../Styles/Styles.xaml"/>
|
||||
</ResourceDictionary.MergedDictionaries>
|
||||
</ResourceDictionary>
|
||||
</mah:MetroWindow.Resources>
|
||||
|
||||
<Grid>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="*"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
</Grid.RowDefinitions>
|
||||
<ScrollViewer VerticalScrollBarVisibility="Auto">
|
||||
<ItemsControl ItemsSource="{Binding ReleaseNotesList}">
|
||||
<ItemsControl.ItemTemplate>
|
||||
<DataTemplate>
|
||||
<GroupBox Margin="20"
|
||||
mah:HeaderedControlHelper.HeaderBackground="{Binding LogDashboard.SelectedColorTheme.Color, Source={StaticResource LogDashLocator}}">
|
||||
<StackPanel>
|
||||
<StackPanel Orientation="Horizontal" Margin="20" HorizontalAlignment="Center">
|
||||
<TextBlock Text="Version: " FontWeight="Black"/>
|
||||
<TextBlock Text="{Binding Version}" FontWeight="Black"/>
|
||||
</StackPanel>
|
||||
|
||||
<TextBlock Text="New Features" Margin="10" FontWeight="Black" HorizontalAlignment="Center"/>
|
||||
|
||||
<ItemsControl ItemsSource="{Binding NewFeatures}" Margin="20">
|
||||
<ItemsControl.ItemTemplate>
|
||||
<DataTemplate>
|
||||
<TextBlock Text="{Binding}" />
|
||||
</DataTemplate>
|
||||
</ItemsControl.ItemTemplate>
|
||||
</ItemsControl>
|
||||
|
||||
<TextBlock Text="Changed Features" Margin="10" FontWeight="Black" HorizontalAlignment="Center"/>
|
||||
|
||||
<ItemsControl ItemsSource="{Binding ChangedFeatures}" Margin="20">
|
||||
<ItemsControl.ItemTemplate>
|
||||
<DataTemplate>
|
||||
<TextBlock Text="{Binding}"/>
|
||||
</DataTemplate>
|
||||
</ItemsControl.ItemTemplate>
|
||||
</ItemsControl>
|
||||
|
||||
<TextBlock Text="Fixed Bugs" Margin="10" FontWeight="Black" HorizontalAlignment="Center"/>
|
||||
|
||||
<ItemsControl ItemsSource="{Binding FixedBugs}" Margin="20">
|
||||
<ItemsControl.ItemTemplate>
|
||||
<DataTemplate>
|
||||
<TextBlock Text="{Binding}"/>
|
||||
</DataTemplate>
|
||||
</ItemsControl.ItemTemplate>
|
||||
</ItemsControl>
|
||||
</StackPanel>
|
||||
</GroupBox>
|
||||
</DataTemplate>
|
||||
</ItemsControl.ItemTemplate>
|
||||
</ItemsControl>
|
||||
</ScrollViewer>
|
||||
<Button Grid.Row="1"
|
||||
Content="OK"
|
||||
IsCancel="True"
|
||||
Height="28"
|
||||
Width="100"
|
||||
Margin="10"
|
||||
HorizontalAlignment="Right"
|
||||
Background="{Binding LogDashboard.SelectedColorTheme.Color, Source={StaticResource LogDashLocator}}"
|
||||
/>
|
||||
</Grid>
|
||||
</mah:MetroWindow>
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
//******************************************************************************//
|
||||
// ReleaseNotesDialog.xaml.cs
|
||||
// 12/4/2023
|
||||
//
|
||||
// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
// PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
// AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
// UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
// RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
// CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
// OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
// COMPANY.
|
||||
//
|
||||
// THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
//
|
||||
// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
//
|
||||
// WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
// EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
// BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
// 120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
// 730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
// OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
// LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
// BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
// APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
// PENALTIES.
|
||||
//
|
||||
// DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
// FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
// INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
// DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
// RECONSTRUCTION OF THE DOCUMENT.
|
||||
// POC: Alex Kravchenko (1118268)
|
||||
//******************************************************************************//
|
||||
using Raytheon.LogDashboard.ViewModel;
|
||||
using System.Windows;
|
||||
|
||||
namespace Raytheon.LogDashboard.View
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for ReleaseNotesDialog.xaml
|
||||
/// </summary>
|
||||
public partial class ReleaseNotesDialog
|
||||
{
|
||||
public ReleaseNotesDialog()
|
||||
{
|
||||
InitializeComponent();
|
||||
DataContext = new ReleaseNotesViewModel();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,213 @@
|
||||
<!--
|
||||
SearchResult.xaml
|
||||
12/4/2023
|
||||
|
||||
RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
COMPANY.
|
||||
|
||||
THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
|
||||
UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
|
||||
WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
PENALTIES.
|
||||
|
||||
DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
RECONSTRUCTION OF THE DOCUMENT.
|
||||
POC: Alex Kravchenko (1118268)
|
||||
-->
|
||||
<mah:MetroWindow x:Class="Raytheon.LogDashboard.View.SearchResult"
|
||||
xmlns:mah="http://metro.mahapps.com/winfx/xaml/controls"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
DataContext="{Binding SearchResult, Source={StaticResource LogDashLocator}}"
|
||||
mc:Ignorable="d"
|
||||
Title="Log Dashboard Search Result"
|
||||
Height="600"
|
||||
Width="1024">
|
||||
|
||||
<mah:MetroWindow.Resources>
|
||||
<ResourceDictionary>
|
||||
<ResourceDictionary.MergedDictionaries>
|
||||
<ResourceDictionary Source="../Styles/Styles.xaml"/>
|
||||
</ResourceDictionary.MergedDictionaries>
|
||||
</ResourceDictionary>
|
||||
</mah:MetroWindow.Resources>
|
||||
|
||||
<Grid>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="0.65*"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="0.35*"/>
|
||||
</Grid.RowDefinitions>
|
||||
<ListView x:Name="FoundResultListView" ItemsSource="{Binding Path=SearchResult, IsAsync=True}"
|
||||
ScrollViewer.CanContentScroll="True" ScrollViewer.VerticalScrollBarVisibility="Auto" SelectedValue="{Binding Path=SelectedLog}"
|
||||
ScrollViewer.HorizontalScrollBarVisibility="Disabled" VirtualizingStackPanel.IsVirtualizing="True"
|
||||
VirtualizingStackPanel.VirtualizationMode="Recycling" GridViewColumnHeader.Click="GridViewColumnHeaderClickedHandler" >
|
||||
<ListView.ItemsPanel>
|
||||
<ItemsPanelTemplate>
|
||||
<VirtualizingStackPanel/>
|
||||
</ItemsPanelTemplate>
|
||||
</ListView.ItemsPanel>
|
||||
<ListView.View>
|
||||
<GridView>
|
||||
<GridViewColumn Header="Level" Width="Auto"
|
||||
CellTemplate="{StaticResource LogLevelImagesDataTemplate}"
|
||||
HeaderContainerStyle="{StaticResource SearchGridViewColumnHeaderStyle}"/>
|
||||
|
||||
<GridViewColumn Header="Time" Width="Auto"
|
||||
DisplayMemberBinding="{Binding Time, StringFormat={}{0:MM/dd/yyyy HH:mm:ss.fff}}"
|
||||
HeaderContainerStyle="{StaticResource SearchGridViewColumnHeaderStyle}"/>
|
||||
|
||||
<GridViewColumn Header="Thread"
|
||||
Width="Auto"
|
||||
DisplayMemberBinding="{Binding Thread}"
|
||||
HeaderContainerStyle="{StaticResource SearchGridViewColumnHeaderStyle}"/>
|
||||
|
||||
<GridViewColumn Header="IP"
|
||||
Width="115"
|
||||
DisplayMemberBinding="{Binding Address}"
|
||||
HeaderContainerStyle="{StaticResource SearchGridViewColumnHeaderStyle}"/>
|
||||
|
||||
<GridViewColumn Header="Logger"
|
||||
Width="120"
|
||||
DisplayMemberBinding="{Binding Logger, Converter={StaticResource LoggerDisplayConverter}}"
|
||||
HeaderContainerStyle="{StaticResource SearchGridViewColumnHeaderStyle}"/>
|
||||
|
||||
<GridViewColumn Header="Message"
|
||||
Width="1500"
|
||||
CellTemplate="{StaticResource LogMessageDataTemplate}"
|
||||
HeaderContainerStyle="{StaticResource SearchGridViewColumnHeaderStyle}"/>
|
||||
</GridView>
|
||||
</ListView.View>
|
||||
<ListView.ContextMenu>
|
||||
<ContextMenu Style="{StaticResource BaseContextMenu}">
|
||||
<MenuItem Header="Go to this log message" ToolTip="Go to this log message in main Log Viewer window" Margin="0" Click="ShowMessageInMainWindowClick"/>
|
||||
</ContextMenu>
|
||||
</ListView.ContextMenu>
|
||||
<ListView.ItemContainerStyle>
|
||||
<Style TargetType="{x:Type ListViewItem}">
|
||||
<EventSetter Event="MouseDoubleClick" Handler="ListViewItem_MouseDoubleClick"/>
|
||||
<Style.Triggers>
|
||||
<DataTrigger Binding="{Binding Level}" Value="Warn">
|
||||
<Setter Property="Foreground" Value="Orange"></Setter>
|
||||
</DataTrigger>
|
||||
<DataTrigger Binding="{Binding Level}" Value="Error">
|
||||
<Setter Property="Foreground" Value="Red"></Setter>
|
||||
</DataTrigger>
|
||||
<DataTrigger Binding="{Binding Level}" Value="Fatal">
|
||||
<Setter Property="Foreground" Value="DarkRed"></Setter>
|
||||
</DataTrigger>
|
||||
<DataTrigger Binding="{Binding Level}" Value="Info">
|
||||
<Setter Property="Foreground" Value="Green"></Setter>
|
||||
</DataTrigger>
|
||||
<DataTrigger Binding="{Binding Level}" Value="Debug">
|
||||
<Setter Property="Foreground" Value="Black"></Setter>
|
||||
</DataTrigger>
|
||||
<DataTrigger Binding="{Binding Level}" Value="Trace">
|
||||
<Setter Property="Foreground" Value="Gray"></Setter>
|
||||
</DataTrigger>
|
||||
<Trigger Property="IsEnabled" Value="False">
|
||||
<Setter Property="Opacity" Value="0.5"/>
|
||||
</Trigger>
|
||||
</Style.Triggers>
|
||||
</Style>
|
||||
</ListView.ItemContainerStyle>
|
||||
</ListView>
|
||||
<GridSplitter Grid.Column="0" Height="3" Grid.Row="1" ResizeDirection="Rows" Background="Gray"
|
||||
HorizontalAlignment="Stretch"/>
|
||||
|
||||
<GroupBox Grid.Row="2" Padding="0,5">
|
||||
<GroupBox.HeaderTemplate>
|
||||
<DataTemplate>
|
||||
<Grid Height="25" Margin="10,0">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition/>
|
||||
<ColumnDefinition/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<TextBlock Text="Message Details" FontSize="16" Foreground="LightGray"/>
|
||||
<TextBlock Grid.Column="1" Text="Fount Logs:" VerticalAlignment="Center" HorizontalAlignment="Right" Margin="0,0,5,0" Foreground="LightGray"/>
|
||||
<TextBlock Grid.Column="2" Text="{Binding Path=DataContext.SearchResult.Count, RelativeSource={RelativeSource AncestorType=mah:MetroWindow}}"
|
||||
HorizontalAlignment="Right" VerticalAlignment="Center" Margin="0,0,15,0" Foreground="LightGray"/>
|
||||
</Grid>
|
||||
</DataTemplate>
|
||||
</GroupBox.HeaderTemplate>
|
||||
|
||||
<Grid Margin="10">
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="*"/>
|
||||
<RowDefinition Height="60"/>
|
||||
</Grid.RowDefinitions>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="80"/>
|
||||
<ColumnDefinition Width="*"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
|
||||
<TextBlock Text="{Binding Message, StringFormat={}{0}:}" FontSize="14" VerticalAlignment="Top" Margin="0,5,0,0"/>
|
||||
<Button Grid.Row="0" Grid.Column="0" VerticalAlignment="Bottom" ToolTip="Copy" Command="{Binding Path=CopyMessageCommand}" Margin="0,5">
|
||||
<Image Source="{StaticResource CopyDrawingImage}"/>
|
||||
</Button>
|
||||
<TextBox x:Name="LoggerTextBox"
|
||||
Grid.Row="0"
|
||||
Text="{Binding Path=SelectedLog.Message}"
|
||||
FontSize="14" Grid.Column="1"
|
||||
VerticalAlignment="Stretch"
|
||||
TextWrapping="Wrap" Margin="10,0"
|
||||
BorderThickness="1"
|
||||
VerticalContentAlignment="Top"
|
||||
HorizontalAlignment="Stretch" Padding="5,0" Height="Auto" IsReadOnly="True" VerticalScrollBarVisibility="Auto"/>
|
||||
|
||||
|
||||
<Grid Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2" Margin="20,10,10,10">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
|
||||
<TextBlock Text="{Binding Logger, StringFormat={}{0}:}" FontSize="14" VerticalAlignment="Center"/>
|
||||
<TextBox Text="{Binding Path=SelectedLog.Logger}" FontSize="14" Grid.Column="1" Height="35" Margin="23,0,10,0"
|
||||
BorderThickness="1" VerticalContentAlignment="Center" HorizontalAlignment="Stretch" Padding="5,0" IsReadOnly="True"/>
|
||||
|
||||
<TextBlock Grid.Column="2" Text="{Binding Time, StringFormat={}{0}:}" FontSize="14" VerticalAlignment="Center" HorizontalAlignment="Left"/>
|
||||
<TextBox Text="{Binding Path=SelectedLog.Time, StringFormat={}{0:MM/dd/yyyy HH:mm:ss.fff}}" FontSize="14" Grid.Column="3" Height="35" Margin="10,0" Width="180"
|
||||
BorderThickness="1" VerticalContentAlignment="Center" HorizontalAlignment="Left" Padding="5,0" IsReadOnly="True"/>
|
||||
|
||||
<TextBlock Grid.Column="4" Text="{Binding Thread, StringFormat={}{0}:}" FontSize="14" VerticalAlignment="Center" HorizontalAlignment="Right"/>
|
||||
<TextBox Text="{Binding Path=SelectedLog.Thread}" FontSize="14" Grid.Column="5" Height="35" Margin="10,0" Width="80"
|
||||
BorderThickness="1" VerticalContentAlignment="Center" HorizontalAlignment="Left" Padding="5,0" IsReadOnly="True"/>
|
||||
|
||||
<TextBlock Grid.Column="6" Text="{Binding Port, StringFormat={}{0}:}" FontSize="14" VerticalAlignment="Center" HorizontalAlignment="Right"/>
|
||||
<TextBox Text="{Binding Path=SelectedLog.Port}" FontSize="14" Grid.Column="7" Height="35" Margin="10,0,0,0" Width="80"
|
||||
BorderThickness="1" VerticalContentAlignment="Center" HorizontalAlignment="Right" Padding="5,0" IsReadOnly="True"/>
|
||||
</Grid>
|
||||
</Grid>
|
||||
</GroupBox>
|
||||
</Grid>
|
||||
</mah:MetroWindow>
|
||||
|
||||
@@ -0,0 +1,150 @@
|
||||
//******************************************************************************//
|
||||
// SearchResult.xaml.cs
|
||||
// 12/4/2023
|
||||
//
|
||||
// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
// PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
// AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
// UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
// RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
// CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
// OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
// COMPANY.
|
||||
//
|
||||
// THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
//
|
||||
// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
//
|
||||
// WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
// EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
// BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
// 120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
// 730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
// OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
// LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
// BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
// APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
// PENALTIES.
|
||||
//
|
||||
// DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
// FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
// INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
// DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
// RECONSTRUCTION OF THE DOCUMENT.
|
||||
// POC: Alex Kravchenko (1118268)
|
||||
//******************************************************************************//
|
||||
using Raytheon.LogDashboard.Model;
|
||||
using Raytheon.LogDashboard.ViewModel;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.ComponentModel;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Data;
|
||||
using System.Windows.Input;
|
||||
|
||||
namespace Raytheon.LogDashboard.View
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for SearchResult.xaml
|
||||
/// </summary>
|
||||
public partial class SearchResult
|
||||
{
|
||||
public event EventHandler<LogMessage> ShowLogEvent;
|
||||
|
||||
public SearchResult(List<LogMessage> searchResult, string searchText, bool isMatchCase)
|
||||
{
|
||||
InitializeComponent();
|
||||
var dataContext = new SearchResultViewModel
|
||||
{
|
||||
SearchResult = new ObservableCollection<LogMessage>(searchResult),
|
||||
HighlightSearchText = searchText,
|
||||
IsMatchCase = isMatchCase
|
||||
};
|
||||
DataContext = dataContext;
|
||||
}
|
||||
|
||||
#region Sorting
|
||||
|
||||
GridViewColumnHeader lastHeaderClicked = null;
|
||||
ListSortDirection lastDirection = ListSortDirection.Ascending;
|
||||
|
||||
private void GridViewColumnHeaderClickedHandler(object sender, RoutedEventArgs e)
|
||||
{
|
||||
var headerClicked = e.OriginalSource as GridViewColumnHeader;
|
||||
|
||||
if (headerClicked != null)
|
||||
{
|
||||
if (headerClicked.Role != GridViewColumnHeaderRole.Padding)
|
||||
{
|
||||
ListSortDirection direction;
|
||||
if (headerClicked != lastHeaderClicked)
|
||||
{
|
||||
direction = ListSortDirection.Ascending;
|
||||
}
|
||||
else
|
||||
{
|
||||
direction = lastDirection == ListSortDirection.Ascending ? ListSortDirection.Descending : ListSortDirection.Ascending;
|
||||
}
|
||||
|
||||
var columnBinding = headerClicked.Column.DisplayMemberBinding as Binding;
|
||||
var sortBy = columnBinding?.Path.Path ?? headerClicked.Column.Header as string;
|
||||
|
||||
Sort(sortBy, direction);
|
||||
|
||||
if (direction == ListSortDirection.Ascending)
|
||||
{
|
||||
headerClicked.Column.HeaderTemplate =
|
||||
Resources["HeaderTemplateArrowUp"] as DataTemplate;
|
||||
}
|
||||
else
|
||||
{
|
||||
headerClicked.Column.HeaderTemplate =
|
||||
Resources["HeaderTemplateArrowDown"] as DataTemplate;
|
||||
}
|
||||
|
||||
// Remove arrow from previously sorted header
|
||||
if (lastHeaderClicked != null && lastHeaderClicked != headerClicked)
|
||||
{
|
||||
lastHeaderClicked.Column.HeaderTemplate = null;
|
||||
}
|
||||
|
||||
lastHeaderClicked = headerClicked;
|
||||
lastDirection = direction;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void Sort(string sortBy, ListSortDirection direction)
|
||||
{
|
||||
ICollectionView dataView = CollectionViewSource.GetDefaultView(FoundResultListView.ItemsSource);
|
||||
|
||||
dataView.SortDescriptions.Clear();
|
||||
SortDescription sd = new SortDescription(sortBy, direction);
|
||||
dataView.SortDescriptions.Add(sd);
|
||||
dataView.Refresh();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
protected virtual void OnShowLogEvent(LogMessage e)
|
||||
{
|
||||
ShowLogEvent?.Invoke(this, e);
|
||||
}
|
||||
|
||||
private void ShowMessageInMainWindowClick(object sender, RoutedEventArgs e)
|
||||
{
|
||||
OnShowLogEvent((LogMessage)FoundResultListView.SelectedItem);
|
||||
}
|
||||
|
||||
private void ListViewItem_MouseDoubleClick(object sender, MouseButtonEventArgs e)
|
||||
{
|
||||
if (sender is ListViewItem item && item.Content is LogMessage logMessage)
|
||||
{
|
||||
OnShowLogEvent(logMessage);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,111 @@
|
||||
<!--
|
||||
SelectTimeIntervalDialog.xaml
|
||||
12/4/2023
|
||||
|
||||
RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
COMPANY.
|
||||
|
||||
THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
|
||||
UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
|
||||
WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
PENALTIES.
|
||||
|
||||
DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
RECONSTRUCTION OF THE DOCUMENT.
|
||||
POC: Alex Kravchenko (1118268)
|
||||
-->
|
||||
<mah:MetroWindow x:Class="Raytheon.LogDashboard.View.SelectTimeIntervalDialog"
|
||||
xmlns:mah="http://metro.mahapps.com/winfx/xaml/controls"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
mc:Ignorable="d"
|
||||
Title="Select Time Interval"
|
||||
DataContext="{Binding SelectTimeInterval, Source={StaticResource LogDashLocator}}"
|
||||
WindowTitleBrush="{Binding LogDashboard.SelectedColorTheme.Color, Source={StaticResource LogDashLocator}}"
|
||||
MinHeight="350"
|
||||
Height="350"
|
||||
Width="500">
|
||||
|
||||
<mah:MetroWindow.Resources>
|
||||
<ResourceDictionary>
|
||||
<ResourceDictionary.MergedDictionaries>
|
||||
<ResourceDictionary Source="../Styles/Styles.xaml"/>
|
||||
</ResourceDictionary.MergedDictionaries>
|
||||
</ResourceDictionary>
|
||||
</mah:MetroWindow.Resources>
|
||||
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition />
|
||||
<ColumnDefinition />
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="*"/>
|
||||
<RowDefinition Height="*"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<TextBlock HorizontalAlignment="Center"
|
||||
FontWeight="Bold"
|
||||
Text="Pick Date and Time From:"/>
|
||||
|
||||
<mah:TimePicker Grid.Column="1"
|
||||
Margin="20"
|
||||
FontSize="14"
|
||||
Height="40"
|
||||
Width="160"
|
||||
FontWeight="Bold"
|
||||
SelectedDateTime="{Binding SelectedDateTimeFrom}" />
|
||||
|
||||
<TextBlock Grid.Row="1"
|
||||
HorizontalAlignment="Center"
|
||||
FontWeight="Bold"
|
||||
Text="Pick Date and Time To:"/>
|
||||
|
||||
<mah:TimePicker Grid.Row="1" Grid.Column="2"
|
||||
Margin="20"
|
||||
Height="40"
|
||||
Width="160"
|
||||
FontSize="14"
|
||||
FontWeight="Bold"
|
||||
SelectedDateTime="{Binding SelectedDateTimeTo}" />
|
||||
|
||||
<WrapPanel Grid.Row="3" Grid.ColumnSpan="2" HorizontalAlignment="Right" Margin="10">
|
||||
<Button Click="OkButtonClick"
|
||||
IsDefault="True"
|
||||
MinWidth="100"
|
||||
Height="30"
|
||||
Margin="10"
|
||||
Content="OK"
|
||||
Background="{Binding LogDashboard.SelectedColorTheme.Color, Source={StaticResource LogDashLocator}}"
|
||||
/>
|
||||
<Button IsCancel="True"
|
||||
MinWidth="100"
|
||||
Margin="10"
|
||||
Content="Cancel"
|
||||
Background="{Binding LogDashboard.SelectedColorTheme.Color, Source={StaticResource LogDashLocator}}"
|
||||
/>
|
||||
</WrapPanel>
|
||||
</Grid>
|
||||
</mah:MetroWindow>
|
||||
@@ -0,0 +1,66 @@
|
||||
//******************************************************************************//
|
||||
// SelectTimeIntervalDialog.xaml.cs
|
||||
// 12/4/2023
|
||||
//
|
||||
// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
// PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
// AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
// UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
// RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
// CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
// OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
// COMPANY.
|
||||
//
|
||||
// THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
//
|
||||
// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
//
|
||||
// WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
// EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
// BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
// 120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
// 730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
// OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
// LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
// BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
// APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
// PENALTIES.
|
||||
//
|
||||
// DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
// FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
// INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
// DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
// RECONSTRUCTION OF THE DOCUMENT.
|
||||
// POC: Alex Kravchenko (1118268)
|
||||
//******************************************************************************//
|
||||
using System;
|
||||
using System.Windows;
|
||||
using Raytheon.LogDashboard.ViewModel;
|
||||
|
||||
namespace Raytheon.LogDashboard.View
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for SelectTimeIntervalDialog.xaml
|
||||
/// </summary>
|
||||
public partial class SelectTimeIntervalDialog
|
||||
{
|
||||
public SelectTimeIntervalDialog(DateTime? currentLogDateTime)
|
||||
{
|
||||
InitializeComponent();
|
||||
|
||||
var dataContext = new SelectTimeIntervalViewModel();
|
||||
if (currentLogDateTime.HasValue)
|
||||
{
|
||||
dataContext.SetSelectTimeInterval(currentLogDateTime.Value);
|
||||
}
|
||||
|
||||
DataContext = dataContext;
|
||||
|
||||
}
|
||||
|
||||
private void OkButtonClick(object sender, RoutedEventArgs e)
|
||||
{
|
||||
DialogResult = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,95 @@
|
||||
<!--
|
||||
SelectTimestampDialog.xaml
|
||||
12/4/2023
|
||||
|
||||
RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
COMPANY.
|
||||
|
||||
THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
|
||||
UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
|
||||
WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
PENALTIES.
|
||||
|
||||
DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
RECONSTRUCTION OF THE DOCUMENT.
|
||||
POC: Alex Kravchenko (1118268)
|
||||
-->
|
||||
<mah:MetroWindow x:Class="Raytheon.LogDashboard.View.SelectTimestampDialog"
|
||||
xmlns:mah="http://metro.mahapps.com/winfx/xaml/controls"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
mc:Ignorable="d"
|
||||
Title="Go to Timestamp"
|
||||
DataContext="{Binding SelectTimeInterval, Source={StaticResource LogDashLocator}}"
|
||||
WindowTitleBrush="{Binding LogDashboard.SelectedColorTheme.Color, Source={StaticResource LogDashLocator}}"
|
||||
MinHeight="350"
|
||||
Height="350"
|
||||
Width="500">
|
||||
|
||||
<mah:MetroWindow.Resources>
|
||||
<ResourceDictionary>
|
||||
<ResourceDictionary.MergedDictionaries>
|
||||
<ResourceDictionary Source="../Styles/Styles.xaml"/>
|
||||
</ResourceDictionary.MergedDictionaries>
|
||||
</ResourceDictionary>
|
||||
</mah:MetroWindow.Resources>
|
||||
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition />
|
||||
<ColumnDefinition />
|
||||
</Grid.ColumnDefinitions>
|
||||
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="*"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<TextBlock FontWeight="Bold"
|
||||
Text="Pick Date and Time:"></TextBlock>
|
||||
|
||||
<mah:TimePicker Grid.Column="1"
|
||||
Margin="10"
|
||||
Height="40"
|
||||
Width="160"
|
||||
FontSize="14"
|
||||
FontWeight="Bold"
|
||||
SelectedDateTime="{Binding SelectedDateTimeFrom}" />
|
||||
|
||||
<WrapPanel Grid.Row="2" Grid.ColumnSpan="2" HorizontalAlignment="Right" Margin="10">
|
||||
<Button Click="OkButtonClick"
|
||||
IsDefault="True"
|
||||
MinWidth="100"
|
||||
Height="30"
|
||||
Margin="0,0,10,0"
|
||||
Content="OK"
|
||||
Background="{Binding LogDashboard.SelectedColorTheme.Color, Source={StaticResource LogDashLocator}}"/>
|
||||
|
||||
<Button IsCancel="True"
|
||||
MinWidth="100"
|
||||
Content="Cancel"
|
||||
Background="{Binding LogDashboard.SelectedColorTheme.Color, Source={StaticResource LogDashLocator}}"/>
|
||||
</WrapPanel>
|
||||
</Grid>
|
||||
</mah:MetroWindow>
|
||||
@@ -0,0 +1,63 @@
|
||||
//******************************************************************************//
|
||||
// SelectTimestampDialog.xaml.cs
|
||||
// 12/4/2023
|
||||
//
|
||||
// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
// PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
// AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
// UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
// RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
// CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
// OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
// COMPANY.
|
||||
//
|
||||
// THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
//
|
||||
// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
//
|
||||
// WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
// EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
// BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
// 120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
// 730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
// OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
// LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
// BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
// APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
// PENALTIES.
|
||||
//
|
||||
// DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
// FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
// INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
// DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
// RECONSTRUCTION OF THE DOCUMENT.
|
||||
// POC: Alex Kravchenko (1118268)
|
||||
//******************************************************************************//
|
||||
using System;
|
||||
using System.Windows;
|
||||
using Raytheon.LogDashboard.ViewModel;
|
||||
|
||||
namespace Raytheon.LogDashboard.View
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for SelectTimestampDialog.xaml
|
||||
/// </summary>
|
||||
public partial class SelectTimestampDialog
|
||||
{
|
||||
public SelectTimestampDialog(DateTime? currentLogDateTime)
|
||||
{
|
||||
InitializeComponent();
|
||||
var dataContext = new SelectTimeIntervalViewModel();
|
||||
if (currentLogDateTime.HasValue)
|
||||
{
|
||||
dataContext.SetSelectTimeInterval(currentLogDateTime.Value);
|
||||
}
|
||||
|
||||
DataContext = dataContext;
|
||||
}
|
||||
private void OkButtonClick(object sender, RoutedEventArgs e)
|
||||
{
|
||||
DialogResult = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,505 @@
|
||||
<!--
|
||||
SettingsCtrl.xaml
|
||||
12/4/2023
|
||||
|
||||
RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
COMPANY.
|
||||
|
||||
THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
|
||||
UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
|
||||
WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
PENALTIES.
|
||||
|
||||
DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
RECONSTRUCTION OF THE DOCUMENT.
|
||||
POC: Alex Kravchenko (1118268)
|
||||
-->
|
||||
<mah:MetroContentControl x:Class="Raytheon.LogDashboard.View.SettingsCtrl"
|
||||
xmlns:mah="http://metro.mahapps.com/winfx/xaml/controls"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:val="clr-namespace:Raytheon.LogDashboard.Validators"
|
||||
xmlns:ext="clr-namespace:Raytheon.LogDashboard.Helpers"
|
||||
xmlns:mod="clr-namespace:Raytheon.LogDashboard.Model"
|
||||
mc:Ignorable="d"
|
||||
d:DesignHeight="800" d:DesignWidth="800">
|
||||
|
||||
|
||||
<mah:MetroContentControl.Resources>
|
||||
<ResourceDictionary>
|
||||
<ResourceDictionary.MergedDictionaries>
|
||||
<ResourceDictionary Source="../Styles/Styles.xaml"/>
|
||||
</ResourceDictionary.MergedDictionaries>
|
||||
</ResourceDictionary>
|
||||
</mah:MetroContentControl.Resources>
|
||||
|
||||
<Grid>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition/>
|
||||
<RowDefinition Height="50"/>
|
||||
</Grid.RowDefinitions>
|
||||
<TabControl BorderThickness="0">
|
||||
<TabItem Header="General" Height="45" Width="120">
|
||||
<GroupBox FontSize="16">
|
||||
<GroupBox.HeaderTemplate>
|
||||
<DataTemplate>
|
||||
<TextBlock Text="General Settings" FontSize="16" />
|
||||
</DataTemplate>
|
||||
</GroupBox.HeaderTemplate>
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="265"/>
|
||||
<ColumnDefinition/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<TextBlock Text="Auto start reading logs at startup:"
|
||||
ToolTip="Start read logs immediately when application startup" VerticalAlignment="Center"
|
||||
Visibility="{Binding Path=EmbeddedMode, Converter={StaticResource BooleanToVisibilityConverter}}"
|
||||
/>
|
||||
<mah:ToggleSwitch Grid.Row="0" Grid.Column="1" IsOn="{Binding Path=IsAutoStartReadAtStartup}"
|
||||
Style="{DynamicResource MetroCircleToggleButtonStyle}"
|
||||
Visibility="{Binding Path=EmbeddedMode, Converter={StaticResource BooleanToVisibilityConverter}}"
|
||||
VerticalAlignment="Center" HorizontalAlignment="Left" Margin="0,5,0,0"/>
|
||||
|
||||
<TextBlock Text="Minimize to Tray Icon:"
|
||||
Visibility="{Binding Path=EmbeddedMode, Converter={StaticResource BooleanToVisibilityConverter}}"
|
||||
ToolTip="Shows a tray icon when LogDashboard is minimized" VerticalAlignment="Center"
|
||||
Grid.Row="1"/>
|
||||
<mah:ToggleSwitch Grid.Row="1" Grid.Column="1"
|
||||
Visibility="{Binding Path=EmbeddedMode, Converter={StaticResource BooleanToVisibilityConverter}}"
|
||||
IsOn="{Binding Path=MinimizeToTray}"
|
||||
VerticalAlignment="Center"
|
||||
HorizontalAlignment="Left" Margin="0,5,0,0"/>
|
||||
|
||||
<TextBlock Text="Only one instance of application:" ToolTip="Only one instance of LogDashboard running in the system"
|
||||
VerticalAlignment="Center" Grid.Row="2"/>
|
||||
<mah:ToggleSwitch Grid.Row="2" Grid.Column="1" IsOn="{Binding Path=OnlyOneAppInstance}" VerticalAlignment="Center" HorizontalAlignment="Left" Margin="0,5,0,0"/>
|
||||
|
||||
<TextBlock Text="Show data source column:" ToolTip="Show data source column in log table. Displays where this message came from (file or IP)" VerticalAlignment="Center" Grid.Row="3"/>
|
||||
|
||||
<mah:ToggleSwitch
|
||||
Grid.Row="3"
|
||||
Grid.Column="1"
|
||||
IsOn="{Binding Path=IsShowSourceColumn}"
|
||||
VerticalAlignment="Center" HorizontalAlignment="Left" Margin="0,5,0,0"/>
|
||||
|
||||
<TextBlock Text="Show thread # column:" ToolTip="Show thread number column in log table" VerticalAlignment="Center" Grid.Row="4"/>
|
||||
<mah:ToggleSwitch
|
||||
Grid.Row="4" Grid.Column="1"
|
||||
IsOn="{Binding Path=IsShowThreadColumn}"
|
||||
VerticalAlignment="Center"
|
||||
HorizontalAlignment="Left" Margin="0,5,0,0"/>
|
||||
|
||||
<TextBlock Grid.Row="6" Text="Max message buffer size:" VerticalAlignment="Center" ToolTip="Maximum count of log messages that can be stored in buffer"/>
|
||||
<StackPanel Orientation="Horizontal" Grid.Row="6" Grid.Column="1">
|
||||
<TextBox Width="100" Margin="0,0,10,0"
|
||||
FontSize="14"
|
||||
HorizontalContentAlignment="Left"
|
||||
Text="{Binding Path=MaxMessageBufferSize, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" IsEnabled="{Binding Path=IsEnableMaxMessageBufferSize}"/>
|
||||
<mah:ToggleSwitch IsOn="{Binding Path=IsEnableMaxMessageBufferSize}" VerticalAlignment="Center" HorizontalAlignment="Left" Margin="0,5,0,0"/>
|
||||
</StackPanel>
|
||||
|
||||
<TextBlock Grid.Row="7" Text="Count of Deleted Messages" VerticalAlignment="Center"
|
||||
ToolTip="Count of messages to be deleted if buffer is overflow"
|
||||
IsEnabled="{Binding Path=IsEnableMaxMessageBufferSize}"/>
|
||||
<TextBox Grid.Row="7"
|
||||
Grid.Column="1" Width="100"
|
||||
FontSize="14"
|
||||
HorizontalAlignment="Left"
|
||||
HorizontalContentAlignment="Left"
|
||||
Text="{Binding Path=DeletedMessagesCount, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
||||
IsEnabled="{Binding Path=IsEnableMaxMessageBufferSize}"/>
|
||||
|
||||
<TextBlock Grid.Row="8" Text="Displayed date format:" ToolTip="Displayed date format" VerticalAlignment="Center"/>
|
||||
<ComboBox Grid.Row="8" Grid.Column="1"
|
||||
Margin="0,5"
|
||||
FontSize="14"
|
||||
ItemsSource="{Binding Path=DataFormats}"
|
||||
SelectedItem="{Binding Path=SelectedDataFormat}"
|
||||
Width="210"
|
||||
HorizontalAlignment="Left"
|
||||
ToolTip="{Binding Path=ExampleDateTime}"/>
|
||||
|
||||
<TextBlock Grid.Row="9" Text="Color Theme:" ToolTip="Application Color" VerticalAlignment="Center"
|
||||
Visibility="{Binding Path=EmbeddedMode, Converter={StaticResource BooleanToVisibilityConverter}}"/>
|
||||
<ComboBox Grid.Row="9" Grid.Column="1"
|
||||
Visibility="{Binding Path=EmbeddedMode, Converter={StaticResource BooleanToVisibilityConverter}}"
|
||||
FontSize="14"
|
||||
Margin="0,5"
|
||||
Height="28"
|
||||
ItemsSource="{Binding Path=ColorThemes}"
|
||||
SelectedIndex="{Binding Path=SelectedColorIndex}"
|
||||
Width="210"
|
||||
HorizontalAlignment="Left">
|
||||
|
||||
<ComboBox.ItemTemplate>
|
||||
<DataTemplate>
|
||||
<Viewbox>
|
||||
<TextBlock Text="{Binding Name}"
|
||||
Width="210"
|
||||
Background="{Binding Color}"
|
||||
Height="20"
|
||||
HorizontalAlignment="Stretch" />
|
||||
</Viewbox>
|
||||
</DataTemplate>
|
||||
</ComboBox.ItemTemplate>
|
||||
</ComboBox>
|
||||
<TextBlock Grid.Row="10" Text="Theme:" ToolTip="Application Theme" VerticalAlignment="Center"
|
||||
Visibility="{Binding Path=EmbeddedMode, Converter={StaticResource BooleanToVisibilityConverter}}"/>
|
||||
<ComboBox Grid.Row="10" Grid.Column="1"
|
||||
Visibility="{Binding Path=EmbeddedMode, Converter={StaticResource BooleanToVisibilityConverter}}"
|
||||
FontSize="14"
|
||||
Margin="0,5"
|
||||
ItemsSource="{Binding Path=Themes}"
|
||||
SelectedItem="{Binding Path=SelectedTheme}"
|
||||
Width="210"
|
||||
HorizontalAlignment="Left">
|
||||
</ComboBox>
|
||||
|
||||
<TextBlock Grid.Row="12" Text="Highlight messages by receiver color:" ToolTip="Highlight messages by receiver color" VerticalAlignment="Center" />
|
||||
<mah:ToggleSwitch Grid.Row="12" Grid.Column="1" IsOn="{Binding Path=ShowMessageHighlightByReceiverColor}" VerticalAlignment="Center" HorizontalAlignment="Left" Margin="0,5,0,0"/>
|
||||
|
||||
<TextBlock Grid.Row="13" Text="Separate UDP Loggers by ports:" ToolTip="Separate UDP loggers by ports" VerticalAlignment="Center" />
|
||||
<mah:ToggleSwitch Grid.Row="13" Grid.Column="1" IsOn="{Binding Path=IsSeparateIPLoggersByPort}" VerticalAlignment="Center" HorizontalAlignment="Left" Margin="0,5,0,0"/>
|
||||
|
||||
<TextBlock Grid.Row="14" Text="AutoSave participating receivers:" VerticalAlignment="Center" />
|
||||
<mah:ToggleSwitch Grid.Row="14" Grid.Column="1"
|
||||
Margin="0,5,0,0"
|
||||
IsOn="{Binding Path=IsAutoSave}"
|
||||
Style="{DynamicResource MetroCircleToggleButtonStyle}"
|
||||
VerticalAlignment="Center"
|
||||
HorizontalAlignment="Left"/>
|
||||
|
||||
<TextBlock Grid.Row="15"
|
||||
Visibility="{Binding Path=IsAutoSave, Converter={StaticResource BooleanToVisibilityConverter}}"
|
||||
Text="Use ErrorLogger Location"
|
||||
ToolTip="Track location from the ErrorLogger configuration default location."
|
||||
VerticalAlignment="Center" />
|
||||
<mah:ToggleSwitch Grid.Row="15" Grid.Column="1"
|
||||
Visibility="{Binding Path=IsAutoSave, Converter={StaticResource BooleanToVisibilityConverter}}"
|
||||
IsOn="{Binding Path=IsErrorLogger}"
|
||||
VerticalAlignment="Center"
|
||||
HorizontalAlignment="Left" Margin="0,5,0,0"/>
|
||||
|
||||
<TextBlock Grid.Row="16" Text="Custom AutoSave Location"
|
||||
Visibility="{Binding Path=IsAutoSaveEnabled, Converter={StaticResource BooleanToVisibilityConverter}}"
|
||||
VerticalAlignment="Center" />
|
||||
|
||||
<StackPanel Grid.Row="16" Grid.Column="1"
|
||||
Orientation="Horizontal"
|
||||
Visibility="{Binding Path=IsAutoSaveEnabled, Converter={StaticResource BooleanToVisibilityConverter}}"
|
||||
>
|
||||
<TextBox
|
||||
Margin="0,10"
|
||||
MinWidth="200"
|
||||
Text="{Binding Path=AutoSaveLocation, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
||||
ToolTip="Please populate with the destination folder or destination folder with the base file name. Use yyyy-mm-dd or yyyy-mm in the path for separating log files by date." />
|
||||
|
||||
<Button Content="Browse"
|
||||
Margin="5"
|
||||
HorizontalAlignment="Right"
|
||||
Background="{Binding DataContext.IconColor, RelativeSource={RelativeSource AncestorType=mah:MetroWindow}}"
|
||||
Command="{Binding Path=BrowseLocationCommand}"
|
||||
/>
|
||||
|
||||
</StackPanel>
|
||||
|
||||
|
||||
</Grid>
|
||||
</GroupBox>
|
||||
</TabItem>
|
||||
<TabItem Header="Receivers"
|
||||
Height="45"
|
||||
Width="120">
|
||||
<GroupBox FontSize="16">
|
||||
<GroupBox.HeaderTemplate>
|
||||
<DataTemplate>
|
||||
<TextBlock Text="List of Receivers" FontSize="16"/>
|
||||
</DataTemplate>
|
||||
</GroupBox.HeaderTemplate>
|
||||
<Grid>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="45"/>
|
||||
<RowDefinition/>
|
||||
</Grid.RowDefinitions>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="220"/>
|
||||
<ColumnDefinition/>
|
||||
</Grid.ColumnDefinitions>
|
||||
|
||||
<Border Grid.RowSpan="2"/>
|
||||
|
||||
<Button Background="{Binding IconColor}"
|
||||
Width="100"
|
||||
HorizontalAlignment="Left"
|
||||
BorderThickness="1"
|
||||
Content="Add" Margin="5"
|
||||
Command="{Binding Path=AddReceiverCommand}"
|
||||
Style="{StaticResource AddButtonStyle}"/>
|
||||
|
||||
<Button Background="{Binding IconColor}"
|
||||
x:Name="RemoveButton" Width="100"
|
||||
HorizontalAlignment="Right"
|
||||
BorderThickness="1"
|
||||
Content="Remove"
|
||||
Margin="5"
|
||||
Command="{Binding Path=RemoveReceiverCommand}"
|
||||
Style="{StaticResource RemoveButtonStyle}"/>
|
||||
|
||||
<ListBox HorizontalContentAlignment="Stretch"
|
||||
Grid.Row="1" Grid.Column="0" Margin="5"
|
||||
ItemsSource="{Binding Path=Receivers}"
|
||||
SelectedItem="{Binding Path=SelectedReceiver}">
|
||||
<ListBox.ItemTemplate>
|
||||
<DataTemplate>
|
||||
<Grid x:Name="ListItemGrid">
|
||||
<TextBlock Text="{Binding Path=Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Width="Auto"/>
|
||||
<CheckBox IsChecked="{Binding Path=IsActive, Mode=TwoWay}" ToolTip="Is Active" HorizontalAlignment="Right"/>
|
||||
</Grid>
|
||||
<DataTemplate.Triggers>
|
||||
<DataTrigger Binding="{Binding Path=IsActive}" Value="False">
|
||||
<Setter Property="ListBoxItem.Opacity" Value=".5"/>
|
||||
</DataTrigger>
|
||||
</DataTemplate.Triggers>
|
||||
</DataTemplate>
|
||||
</ListBox.ItemTemplate>
|
||||
</ListBox>
|
||||
|
||||
<Border Grid.Column="1" Grid.RowSpan="2" Margin="5,0,0,0"/>
|
||||
|
||||
<StackPanel Orientation="Vertical"
|
||||
Grid.RowSpan="2"
|
||||
Grid.Column="1" Margin="10,5,10,5"
|
||||
Visibility="{Binding Path=IsConfigurationVisible, Converter={StaticResource BooleanToVisibilityConverter}}">
|
||||
<TextBlock Text="" FontWeight="Bold"/>
|
||||
<Grid Margin="0,5,0,0">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="120"/>
|
||||
<ColumnDefinition/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="*"/>
|
||||
<RowDefinition Height="*"/>
|
||||
<RowDefinition Height="*"/>
|
||||
<RowDefinition Height="*"/>
|
||||
<RowDefinition Height="*"/>
|
||||
<RowDefinition Height="*"/>
|
||||
<RowDefinition Height="*"/>
|
||||
<RowDefinition Height="*"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<TextBlock Grid.Row="0" Text="Receiver Type" VerticalAlignment="Center" />
|
||||
<ComboBox Grid.Column="1"
|
||||
Margin="0,10"
|
||||
ItemsSource="{Binding Source={ext:Enumeration {x:Type mod:ReceiverType}}}"
|
||||
DisplayMemberPath="Description"
|
||||
SelectedValue="{Binding SelectedReceiver.ReceiverType}"
|
||||
SelectedValuePath="Value"
|
||||
/>
|
||||
|
||||
<TextBlock Grid.Row="1" Text="Receiver Type" VerticalAlignment="Center"
|
||||
Visibility="{Binding Path=SelectedReceiver.IsErrorLogger, Converter={StaticResource BooleanToVisibilityConverter}}"
|
||||
/>
|
||||
<ComboBox Grid.Row="1" Grid.Column="1"
|
||||
Visibility="{Binding Path=SelectedReceiver.IsErrorLogger, Converter={StaticResource BooleanToVisibilityConverter}}"
|
||||
Margin="0,10"
|
||||
ItemsSource="{Binding Source={ext:Enumeration {x:Type mod:ErrorLoggerType}}}"
|
||||
DisplayMemberPath="Description"
|
||||
SelectedValue="{Binding SelectedReceiver.ErrorLoggerType}"
|
||||
SelectedValuePath="Value"
|
||||
/>
|
||||
|
||||
<TextBlock Grid.Row="2" Text="Receiver Name" VerticalAlignment="Center" />
|
||||
<TextBox Grid.Row="2" Grid.Column="1" Margin="0,10"
|
||||
Text="{Binding Path=SelectedReceiver.Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
|
||||
|
||||
<TextBlock Grid.Row="3"
|
||||
Text="Port Number" VerticalAlignment="Center"
|
||||
Visibility="{Binding Path=SelectedReceiver.IsPortVisible, Converter={StaticResource BooleanToVisibilityConverter}}"/>
|
||||
<TextBox Grid.Row="3" Grid.Column="1"
|
||||
Margin="0,10"
|
||||
Visibility="{Binding Path=SelectedReceiver.IsPortVisible, Converter={StaticResource BooleanToVisibilityConverter}}" >
|
||||
<TextBox.Text>
|
||||
<Binding Path="SelectedReceiver.Port" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged">
|
||||
<Binding.ValidationRules>
|
||||
<val:PortNumberValidation ValidatesOnTargetUpdated="True"/>
|
||||
</Binding.ValidationRules>
|
||||
</Binding>
|
||||
</TextBox.Text>
|
||||
</TextBox>
|
||||
|
||||
<TextBlock Grid.Row="4" Text="Address" VerticalAlignment="Center"
|
||||
Visibility="{Binding Path=SelectedReceiver.IsAddressVisible, Converter={StaticResource BooleanToVisibilityConverter}}"/>
|
||||
<TextBox Grid.Row="4" Grid.Column="1"
|
||||
Margin="0,10"
|
||||
Visibility="{Binding Path=SelectedReceiver.IsAddressVisible, Converter={StaticResource BooleanToVisibilityConverter}}"
|
||||
Text="{Binding Path=SelectedReceiver.Address, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
|
||||
|
||||
<TextBlock Grid.Row="5" Text="AutoSave Mode" VerticalAlignment="Center" />
|
||||
<mah:ToggleSwitch Grid.Row="5" Grid.Column="1"
|
||||
Margin="0,10"
|
||||
IsEnabled="{Binding IsAutoSave}"
|
||||
IsOn="{Binding Path=SelectedReceiver.IsAutoSave, Mode=TwoWay}"
|
||||
Style="{DynamicResource MetroCircleToggleButtonStyle}"
|
||||
VerticalAlignment="Center" HorizontalAlignment="Left"/>
|
||||
|
||||
</Grid>
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
</GroupBox>
|
||||
</TabItem>
|
||||
<TabItem Header="Ignored" Height="45" Width="120">
|
||||
<GroupBox FontSize="16">
|
||||
<GroupBox.HeaderTemplate>
|
||||
<DataTemplate>
|
||||
<TextBlock Text="Ignored IP Addresses" FontSize="16" />
|
||||
</DataTemplate>
|
||||
</GroupBox.HeaderTemplate>
|
||||
<Grid>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="45"/>
|
||||
<RowDefinition Height="45"/>
|
||||
<RowDefinition/>
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<Button Grid.Row="0"
|
||||
Background="{Binding DataContext.IconColor, RelativeSource={RelativeSource AncestorType=mah:MetroWindow}}"
|
||||
Style="{StaticResource AddIgnoreIpButtonStyle}"/>
|
||||
<Button Grid.Row="0"
|
||||
Background="{Binding DataContext.IconColor, RelativeSource={RelativeSource AncestorType=mah:MetroWindow}}"
|
||||
Style="{StaticResource RemoveIgnoreIpButtonStyle}"/>
|
||||
|
||||
<TextBox Grid.Row="1" Style="{StaticResource IPTextBoxStyle}" x:Name="IPAddress">
|
||||
<TextBox.Text>
|
||||
<Binding NotifyOnValidationError="True" Path="TypedIP" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged">
|
||||
<Binding.ValidationRules>
|
||||
<val:IPValidation ValidatesOnTargetUpdated="True"/>
|
||||
</Binding.ValidationRules>
|
||||
</Binding>
|
||||
</TextBox.Text>
|
||||
</TextBox>
|
||||
<Border Grid.RowSpan="3"/>
|
||||
|
||||
<ListBox Grid.Row="2" Grid.Column="0" Margin="5,20,5,5"
|
||||
ItemsSource="{Binding Path=IgnoredIPAddresses}"
|
||||
SelectedItem="{Binding Path=SelectedIP}">
|
||||
<ListBox.ItemTemplate>
|
||||
<DataTemplate>
|
||||
<Grid x:Name="ListItemGrid">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="115"/>
|
||||
<ColumnDefinition/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<TextBlock Grid.Column="0" Text="{Binding Path=IP, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Width="Auto"/>
|
||||
<CheckBox VerticalAlignment="Bottom" Grid.Column="1"
|
||||
IsChecked="{Binding Path=IsActive, Mode=TwoWay}"
|
||||
ToolTip="Is Active" HorizontalAlignment="Right"/>
|
||||
</Grid>
|
||||
<DataTemplate.Triggers>
|
||||
<DataTrigger Binding="{Binding Path=IsActive}" Value="False">
|
||||
<Setter Property="ListBoxItem.Opacity" Value="0.5"/>
|
||||
</DataTrigger>
|
||||
</DataTemplate.Triggers>
|
||||
</DataTemplate>
|
||||
</ListBox.ItemTemplate>
|
||||
</ListBox>
|
||||
</Grid>
|
||||
</GroupBox>
|
||||
</TabItem>
|
||||
<TabItem Header="About" Width="100" Height="45">
|
||||
<GroupBox FontSize="16">
|
||||
<GroupBox.HeaderTemplate>
|
||||
<DataTemplate>
|
||||
<TextBlock Text="About" FontSize="16"/>
|
||||
</DataTemplate>
|
||||
</GroupBox.HeaderTemplate>
|
||||
|
||||
<StackPanel Orientation="Vertical">
|
||||
<TextBlock HorizontalAlignment="Center" Text="Log Dashboard"/>
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<TextBlock Text="Version: " FontWeight="Bold"/>
|
||||
<TextBlock Text="{Binding Path=Version}"/>
|
||||
</StackPanel>
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<TextBlock VerticalAlignment="Center" Text="Author: " FontWeight="Bold"/>
|
||||
<TextBlock VerticalAlignment="Center" Text="Alex Kravchenko (Common Platforms)"/>
|
||||
</StackPanel>
|
||||
<TextBlock Text="LogDashboard Features" HorizontalAlignment="Left"/>
|
||||
<Border BorderThickness="1" Margin="0,5" Padding="10">
|
||||
<StackPanel Orientation="Vertical">
|
||||
<TextBlock Text="- Reads log files via log4j template, standard NLog format" HorizontalAlignment="Left"/>
|
||||
<TextBlock Text="- Reads Error Logger messages via Mail Slots" HorizontalAlignment="Left"/>
|
||||
<TextBlock Text="- Reads Windows Debug messages" HorizontalAlignment="Left"/>
|
||||
<TextBlock Text="- Export and import log files" HorizontalAlignment="Left"/>
|
||||
<TextBlock Text="- Sorting and filtering received logs" HorizontalAlignment="Left"/>
|
||||
<TextBlock Text="- Other features (for details see ReleaseNotes)." HorizontalAlignment="Left"/>
|
||||
</StackPanel>
|
||||
</Border>
|
||||
<Button Content="Show Release Notes"
|
||||
Background="{Binding DataContext.IconColor, RelativeSource={RelativeSource AncestorType=mah:MetroWindow}}"
|
||||
Command="{Binding Path=ShowReleaseNotesCommand}" Height="35" Width="200"/>
|
||||
</StackPanel>
|
||||
</GroupBox>
|
||||
</TabItem>
|
||||
</TabControl>
|
||||
|
||||
<Button Grid.Row="1" Grid.ColumnSpan="2"
|
||||
Width="105"
|
||||
HorizontalAlignment="Right"
|
||||
Margin="0,0,140,0"
|
||||
Background="{Binding IconColor}"
|
||||
Content="Save"
|
||||
Command="{Binding Path=SaveCommand}"
|
||||
CommandParameter="{Binding RelativeSource={RelativeSource AncestorType=mah:MetroWindow}}" />
|
||||
|
||||
<Button Grid.Row="1" Grid.ColumnSpan="2"
|
||||
Width="105"
|
||||
HorizontalAlignment="Right"
|
||||
Margin="120,0,20,0"
|
||||
Background="{Binding IconColor}"
|
||||
Content="Cancel"
|
||||
Command="{Binding Path=CancelCommand}"
|
||||
CommandParameter="{Binding RelativeSource={RelativeSource AncestorType=mah:MetroWindow}}"/>
|
||||
</Grid>
|
||||
</mah:MetroContentControl>
|
||||
@@ -0,0 +1,63 @@
|
||||
//******************************************************************************//
|
||||
// SettingsCtrl.xaml.cs
|
||||
// 12/4/2023
|
||||
//
|
||||
// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
// PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
// AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
// UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
// RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
// CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
// OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
// COMPANY.
|
||||
//
|
||||
// THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
//
|
||||
// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
//
|
||||
// WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
// EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
// BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
// 120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
// 730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
// OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
// LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
// BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
// APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
// PENALTIES.
|
||||
//
|
||||
// DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
// FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
// INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
// DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
// RECONSTRUCTION OF THE DOCUMENT.
|
||||
// POC: Alex Kravchenko (1118268)
|
||||
//******************************************************************************//
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Data;
|
||||
using System.Windows.Documents;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Media;
|
||||
using System.Windows.Media.Imaging;
|
||||
using System.Windows.Navigation;
|
||||
using System.Windows.Shapes;
|
||||
|
||||
namespace Raytheon.LogDashboard.View
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for SettingsCtrl.xaml
|
||||
/// </summary>
|
||||
public partial class SettingsCtrl
|
||||
{
|
||||
public SettingsCtrl()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,57 @@
|
||||
<!--
|
||||
SettingsWindow.xaml
|
||||
12/4/2023
|
||||
|
||||
RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
COMPANY.
|
||||
|
||||
THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
|
||||
UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
|
||||
WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
PENALTIES.
|
||||
|
||||
DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
RECONSTRUCTION OF THE DOCUMENT.
|
||||
POC: Alex Kravchenko (1118268)
|
||||
-->
|
||||
<mah:MetroWindow x:Class="Raytheon.LogDashboard.View.SettingsWindow"
|
||||
xmlns:mah="http://metro.mahapps.com/winfx/xaml/controls"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:ctrl="clr-namespace:Raytheon.LogDashboard.View"
|
||||
DataContext="{Binding Settings, Source={StaticResource LogDashLocator}}"
|
||||
WindowTitleBrush="{Binding IconColor}"
|
||||
mc:Ignorable="d"
|
||||
Title="Settings"
|
||||
Height="630"
|
||||
Width="600"
|
||||
MinHeight="505"
|
||||
>
|
||||
|
||||
<mah:MetroContentControl>
|
||||
<ctrl:SettingsCtrl DataContext="{Binding Settings, Source={StaticResource LogDashLocator}}" />
|
||||
</mah:MetroContentControl>
|
||||
|
||||
|
||||
</mah:MetroWindow>
|
||||
@@ -0,0 +1,48 @@
|
||||
//******************************************************************************//
|
||||
// SettingsWindow.xaml.cs
|
||||
// 12/4/2023
|
||||
//
|
||||
// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
// PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
// AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
// UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
// RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
// CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
// OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
// COMPANY.
|
||||
//
|
||||
// THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
//
|
||||
// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
//
|
||||
// WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
// EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
// BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
// 120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
// 730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
// OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
// LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
// BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
// APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
// PENALTIES.
|
||||
//
|
||||
// DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
// FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
// INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
// DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
// RECONSTRUCTION OF THE DOCUMENT.
|
||||
// POC: Alex Kravchenko (1118268)
|
||||
//******************************************************************************//
|
||||
namespace Raytheon.LogDashboard.View
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for SettingsWindow.xaml
|
||||
/// </summary>
|
||||
public partial class SettingsWindow
|
||||
{
|
||||
public SettingsWindow()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,301 @@
|
||||
<!--
|
||||
SidebarTreeView.xaml
|
||||
12/4/2023
|
||||
|
||||
RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
COMPANY.
|
||||
|
||||
THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
|
||||
UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
|
||||
WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
PENALTIES.
|
||||
|
||||
DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
RECONSTRUCTION OF THE DOCUMENT.
|
||||
POC: Alex Kravchenko (1118268)
|
||||
-->
|
||||
<mah:MetroContentControl x:Class="Raytheon.LogDashboard.View.SidebarTreeView"
|
||||
xmlns:mah="http://metro.mahapps.com/winfx/xaml/controls"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:helpers="clr-namespace:Raytheon.LogDashboard.Helpers"
|
||||
xmlns:threeView="clr-namespace:Raytheon.LogDashboard.Model"
|
||||
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
|
||||
DataContext="{Binding LogDashboard, Source={StaticResource LogDashLocator}}"
|
||||
mc:Ignorable="d"
|
||||
d:DesignHeight="450" d:DesignWidth="800">
|
||||
|
||||
<mah:MetroContentControl.Resources>
|
||||
<ResourceDictionary>
|
||||
<ResourceDictionary.MergedDictionaries>
|
||||
<ResourceDictionary Source="../Styles/Styles.xaml"/>
|
||||
</ResourceDictionary.MergedDictionaries>
|
||||
|
||||
<HierarchicalDataTemplate DataType="{x:Type threeView:Node}" ItemsSource="{Binding Children}">
|
||||
|
||||
<StackPanel Orientation="Horizontal" Tag="{Binding DataContext, RelativeSource={RelativeSource AncestorType=mah:MetroContentControl}}">
|
||||
|
||||
<CheckBox IsChecked="{Binding IsChecked}" Uid="{Binding Id}"
|
||||
Command="{Binding Path=DataContext.TreeViewElementCheckCommand, RelativeSource={RelativeSource AncestorType=mah:MetroContentControl}}"
|
||||
x:Name="TreeViewCheckBox"
|
||||
CommandParameter="{Binding RelativeSource={RelativeSource Self}}"
|
||||
PreviewMouseLeftButtonDown="TreeViewCheckBox_OnPreviewMouseLeftButtonDown"
|
||||
PreviewKeyDown="TreeViewCheckBox_OnPreviewKeyDown">
|
||||
</CheckBox>
|
||||
|
||||
<helpers:SearchableTextControl Text="{Binding Text}"
|
||||
SearchText="{Binding DataContext.LoggerHighlightText, RelativeSource={RelativeSource AncestorType=mah:MetroContentControl}}"
|
||||
IsHighlight="True" IsMatchCase="False"
|
||||
Background="{Binding ToggleMark}">
|
||||
<helpers:SearchableTextControl.ToolTip>
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="65"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="30"/>
|
||||
<RowDefinition/>
|
||||
</Grid.RowDefinitions>
|
||||
<TextBlock Grid.Row="0" Text="{Binding Name, StringFormat={}{0}:}" FontWeight="Bold" VerticalAlignment="Top"/>
|
||||
<TextBlock Grid.Row="1" Text="{Binding Source, StringFormat={}{0}:}" FontWeight="Bold"/>
|
||||
|
||||
<TextBlock Grid.Column="1" Grid.Row="0" Text="{Binding Text}" VerticalAlignment="Top"/>
|
||||
<TextBlock Grid.Column="1" Grid.Row="1" Text="{Binding Source}"/>
|
||||
</Grid>
|
||||
</helpers:SearchableTextControl.ToolTip>
|
||||
</helpers:SearchableTextControl>
|
||||
|
||||
<StackPanel.ContextMenu>
|
||||
<ContextMenu Style="{StaticResource BaseContextMenu}">
|
||||
<MenuItem Header="Collapse All"
|
||||
Margin="0"
|
||||
Command="{Binding PlacementTarget.Tag.CollapseChildrenCommand, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=ContextMenu}}"
|
||||
CommandParameter="{Binding}">
|
||||
<MenuItem.Icon>
|
||||
<Image Source="{StaticResource CollapseImage}" Width="24" Height="24" Margin="4"/>
|
||||
</MenuItem.Icon>
|
||||
</MenuItem>
|
||||
|
||||
<MenuItem Header="Expand All"
|
||||
Margin="0"
|
||||
Command="{Binding PlacementTarget.Tag.ExpandChildrenCommand, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=ContextMenu}}"
|
||||
CommandParameter="{Binding}">
|
||||
<MenuItem.Icon>
|
||||
<Image Source="{StaticResource ExpandImage}" Width="24" Height="24" Margin="4"/>
|
||||
</MenuItem.Icon>
|
||||
</MenuItem>
|
||||
|
||||
<Separator />
|
||||
|
||||
<MenuItem Header="Show only this Logger"
|
||||
Command="{Binding PlacementTarget.Tag.ShowOnlyThisLoggerCommand, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=ContextMenu}}"
|
||||
CommandParameter="{Binding}">
|
||||
<MenuItem.Icon>
|
||||
<Image Source="{StaticResource EyeImage}" Width="24" Height="24" Margin="4"/>
|
||||
</MenuItem.Icon>
|
||||
</MenuItem>
|
||||
|
||||
<MenuItem Header="Don't Receive this Logger"
|
||||
ToolTip="Don't add new messages to buffer from this Logger"
|
||||
Command="{Binding PlacementTarget.Tag.DontReceiveThisLoggerCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu}}"
|
||||
CommandParameter="{Binding}">
|
||||
<MenuItem.Icon>
|
||||
<Image Source="{StaticResource StopImage}" Width="24" Height="24" Margin="4"/>
|
||||
</MenuItem.Icon>
|
||||
</MenuItem>
|
||||
|
||||
<MenuItem Header="Add current IP to Ignore List" ToolTip="Don't receive new messages from this IP address"
|
||||
Command="{Binding PlacementTarget.Tag.IgnoreThisIPCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu}}"
|
||||
CommandParameter="{Binding}">
|
||||
<MenuItem.Icon>
|
||||
<Image Source="{StaticResource IgnoreIPStopImage}" Width="24" Height="24" Margin="4"/>
|
||||
</MenuItem.Icon>
|
||||
</MenuItem>
|
||||
|
||||
<MenuItem Header="Toggle Marking" ToolTip="Mark the messages of this logger in a different color"
|
||||
Command="{Binding PlacementTarget.Tag.ToggleMarkCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu}}"
|
||||
CommandParameter="{Binding}">
|
||||
<MenuItem.Icon>
|
||||
<Image Source="{StaticResource MarkDrawingImage}" Width="24" Height="24" Margin="4"/>
|
||||
</MenuItem.Icon>
|
||||
</MenuItem>
|
||||
|
||||
<Separator />
|
||||
|
||||
<MenuItem Header="Clear" Margin="0"
|
||||
Command="{Binding PlacementTarget.Tag.ClearChildrenCommand, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=ContextMenu}}"
|
||||
CommandParameter="{Binding}">
|
||||
<MenuItem.Icon>
|
||||
<Image Source="{StaticResource CleanImage}" Width="24" Height="24" Margin="4"/>
|
||||
</MenuItem.Icon>
|
||||
</MenuItem>
|
||||
|
||||
<Separator />
|
||||
|
||||
<MenuItem Header="Export Current Logger to File" Margin="0"
|
||||
Command="{Binding PlacementTarget.Tag.ExportCommand, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=ContextMenu}}"
|
||||
CommandParameter="{Binding}">
|
||||
<MenuItem.Icon>
|
||||
<Image Source="{StaticResource ExportDrawingImage}" Width="24" Height="24" Margin="4"/>
|
||||
</MenuItem.Icon>
|
||||
</MenuItem>
|
||||
</ContextMenu>
|
||||
</StackPanel.ContextMenu>
|
||||
</StackPanel>
|
||||
</HierarchicalDataTemplate>
|
||||
</ResourceDictionary>
|
||||
</mah:MetroContentControl.Resources>
|
||||
|
||||
<Grid>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="*"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
</Grid.RowDefinitions>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition/>
|
||||
<ColumnDefinition MinWidth="10"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
|
||||
<TextBlock Text="Loggers" FontSize="14" Margin="10, 5" HorizontalAlignment="Left" Foreground="{Binding IconColor}"/>
|
||||
|
||||
<Grid Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="3" Margin="0,0,10,10">
|
||||
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
|
||||
<Border CornerRadius="2" Margin="10,0,0,0" Height="33" HorizontalAlignment="Stretch">
|
||||
<Border.Style>
|
||||
<Style TargetType="{x:Type Border}">
|
||||
<Setter Property="BorderBrush" Value="{Binding FontColor}"/>
|
||||
<Setter Property="BorderThickness" Value="1"/>
|
||||
<Style.Triggers>
|
||||
<DataTrigger Binding="{Binding IsFocused, ElementName=SearchLoggerTextBox}" Value="True">
|
||||
<Setter Property="BorderBrush" Value="{Binding IconColor}" />
|
||||
</DataTrigger>
|
||||
</Style.Triggers>
|
||||
</Style>
|
||||
</Border.Style>
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<TextBox x:Name="SearchLoggerTextBox"
|
||||
Text="{Binding Path=SearchLoggerText, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
||||
Margin="5,0,5,0"
|
||||
BorderThickness="0"
|
||||
HorizontalAlignment="Stretch" VerticalContentAlignment="Center" >
|
||||
<TextBox.InputBindings>
|
||||
<KeyBinding Command="{Binding Path=SearchLoggersCommand}" Key="Return" />
|
||||
</TextBox.InputBindings>
|
||||
</TextBox>
|
||||
|
||||
<Button Grid.Column="1" Margin="0,0,3,0" Padding="0" Height="20" Width="20" ToolTip="Clear search loggers result"
|
||||
Command="{Binding Path=ClearSearchLoggerResultCommand}"
|
||||
Visibility="{Binding Path=IsEnableClearSearchLoggers, Converter={StaticResource BooleanToVisibility}}">
|
||||
<Button.Template>
|
||||
<ControlTemplate TargetType="{x:Type Button}">
|
||||
<Grid x:Name="RootGrid">
|
||||
<Image Source="{StaticResource CancelDrawingImage}" Cursor="Hand"/>
|
||||
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
|
||||
</Grid>
|
||||
|
||||
<ControlTemplate.Triggers>
|
||||
<Trigger Property ="IsPressed" Value ="True">
|
||||
<Setter TargetName="RootGrid" Property="RenderTransform">
|
||||
<Setter.Value>
|
||||
<ScaleTransform ScaleX="0.95" ScaleY="0.95"/>
|
||||
</Setter.Value>
|
||||
</Setter>
|
||||
</Trigger>
|
||||
</ControlTemplate.Triggers>
|
||||
</ControlTemplate>
|
||||
</Button.Template>
|
||||
</Button>
|
||||
</Grid>
|
||||
</Border>
|
||||
|
||||
<Button Grid.Column="1"
|
||||
Height="32"
|
||||
Width="32"
|
||||
Margin="5,0,0,0"
|
||||
Padding="2"
|
||||
ToolTip="Find Loggers"
|
||||
Command="{Binding Path=SearchLoggersCommand}">
|
||||
<Image Source="{StaticResource SearchDrawingImage}"/>
|
||||
<Button.Style>
|
||||
<Style TargetType="{x:Type Button}" BasedOn="{StaticResource CircleImageButtonStyle}">
|
||||
<Style.Triggers>
|
||||
<DataTrigger Binding="{Binding Text.Length, ElementName=SearchLoggerTextBox, UpdateSourceTrigger=PropertyChanged}" Value="0">
|
||||
<Setter Property="IsEnabled" Value="False"/>
|
||||
</DataTrigger>
|
||||
</Style.Triggers>
|
||||
</Style>
|
||||
</Button.Style>
|
||||
</Button>
|
||||
</Grid>
|
||||
|
||||
<TreeView Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="3"
|
||||
VerticalAlignment="Top"
|
||||
ItemsSource="{Binding Path=Loggers}"
|
||||
IsEnabled="{Binding Path=IsEnableLogList}"
|
||||
x:Name="LoggersTreeView"
|
||||
VirtualizingStackPanel.IsVirtualizing="True"
|
||||
VirtualizingStackPanel.VirtualizationMode="Recycling" >
|
||||
<i:Interaction.Behaviors>
|
||||
<helpers:BindableSelectedItemBehavior SelectedItem="{Binding SelectedNode, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
|
||||
</i:Interaction.Behaviors>
|
||||
</TreeView>
|
||||
|
||||
<StackPanel Orientation="Horizontal" Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="3">
|
||||
<Button Grid.Row="3" Grid.Column="0"
|
||||
HorizontalAlignment="Left"
|
||||
VerticalAlignment="Bottom"
|
||||
Content="Collapse All"
|
||||
Width="100"
|
||||
Margin="10"
|
||||
Background="{Binding IconColor}"
|
||||
Command="{Binding Path=CollapseLoggersCommand}"/>
|
||||
|
||||
<Button Grid.Row="3" Grid.Column="1"
|
||||
HorizontalAlignment="Right"
|
||||
VerticalAlignment="Bottom"
|
||||
Background="{Binding IconColor}"
|
||||
Content="Clear All"
|
||||
Width="100"
|
||||
Margin="10"
|
||||
Command="{Binding Path=ClearLoggersCommand}"/>
|
||||
|
||||
</StackPanel>
|
||||
|
||||
</Grid>
|
||||
|
||||
</mah:MetroContentControl>
|
||||
@@ -0,0 +1,71 @@
|
||||
//******************************************************************************//
|
||||
// SidebarTreeView.xaml.cs
|
||||
// 12/4/2023
|
||||
//
|
||||
// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
// PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
// AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
// UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
// RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
// CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
// OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
// COMPANY.
|
||||
//
|
||||
// THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
//
|
||||
// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
//
|
||||
// WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
// EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
// BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
// 120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
// 730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
// OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
// LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
// BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
// APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
// PENALTIES.
|
||||
//
|
||||
// DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
// FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
// INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
// DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
// RECONSTRUCTION OF THE DOCUMENT.
|
||||
// POC: Alex Kravchenko (1118268)
|
||||
//******************************************************************************//
|
||||
using Raytheon.LogDashboard.Model;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Input;
|
||||
|
||||
namespace Raytheon.LogDashboard.View
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for SideBarTree.xaml
|
||||
/// </summary>
|
||||
public partial class SidebarTreeView
|
||||
{
|
||||
public SidebarTreeView()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
#region tree
|
||||
|
||||
private void TreeViewCheckBox_OnPreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
|
||||
{
|
||||
CheckBox currentCheckBox = (CheckBox)sender;
|
||||
CheckBoxId.CurrentСheckBoxId = currentCheckBox.Uid;
|
||||
}
|
||||
|
||||
private void TreeViewCheckBox_OnPreviewKeyDown(object sender, KeyEventArgs e)
|
||||
{
|
||||
if (e.Key == Key.Space)
|
||||
{
|
||||
CheckBox currentCheckBox = (CheckBox)sender;
|
||||
CheckBoxId.CurrentСheckBoxId = currentCheckBox.Uid;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,87 @@
|
||||
//******************************************************************************//
|
||||
// ImportLogsProcessViewModel.cs
|
||||
// 12/4/2023
|
||||
//
|
||||
// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
// PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
// AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
// UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
// RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
// CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
// OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
// COMPANY.
|
||||
//
|
||||
// THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
//
|
||||
// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
//
|
||||
// WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
// EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
// BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
// 120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
// 730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
// OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
// LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
// BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
// APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
// PENALTIES.
|
||||
//
|
||||
// DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
// FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
// INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
// DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
// RECONSTRUCTION OF THE DOCUMENT.
|
||||
// POC: Alex Kravchenko (1118268)
|
||||
//******************************************************************************//
|
||||
using GalaSoft.MvvmLight;
|
||||
using Raytheon.LogDashboard.Model;
|
||||
using GalaSoft.MvvmLight.Command;
|
||||
using MahApps.Metro.Controls;
|
||||
using System.Windows.Input;
|
||||
using System;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.Windows.Media;
|
||||
using System.Windows;
|
||||
|
||||
namespace Raytheon.LogDashboard.ViewModel
|
||||
{
|
||||
public class ImportLogsProcessViewModel : ViewModelBase
|
||||
{
|
||||
protected static LogDashViewModelLocator LocatorInstance => (Application.Current.Resources["LogDashLocator"] as LogDashViewModelLocator);
|
||||
|
||||
public event EventHandler<bool> ImportProcessDialogResult;
|
||||
|
||||
public ObservableCollection<ImportLogFile> ImportFiles { get; set; }
|
||||
|
||||
private ICommand _closeCommand;
|
||||
public ICommand CloseCommand => _closeCommand ?? (_closeCommand = new RelayCommand<MetroWindow>
|
||||
((w) =>
|
||||
{
|
||||
OnImportProcessDialogResult(true);
|
||||
w.Close();
|
||||
}));
|
||||
|
||||
private ICommand _cancelCommand;
|
||||
public ICommand CancelCommand => _cancelCommand ?? (_cancelCommand = new RelayCommand<MetroWindow>
|
||||
((w) =>
|
||||
{
|
||||
OnImportProcessDialogResult(false);
|
||||
w.Close();
|
||||
}));
|
||||
|
||||
protected virtual void OnImportProcessDialogResult(bool e)
|
||||
{
|
||||
ImportProcessDialogResult?.Invoke(this, e);
|
||||
}
|
||||
|
||||
public SolidColorBrush IconColor
|
||||
{
|
||||
get => SelectedColorTheme.Color;
|
||||
}
|
||||
public ColorTheme SelectedColorTheme
|
||||
{
|
||||
get => LocatorInstance.SelectedColorTheme;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,122 @@
|
||||
//******************************************************************************//
|
||||
// LogDashViewModelLocator.cs
|
||||
// 12/4/2023
|
||||
//
|
||||
// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
// PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
// AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
// UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
// RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
// CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
// OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
// COMPANY.
|
||||
//
|
||||
// THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
//
|
||||
// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
//
|
||||
// WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
// EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
// BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
// 120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
// 730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
// OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
// LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
// BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
// APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
// PENALTIES.
|
||||
//
|
||||
// DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
// FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
// INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
// DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
// RECONSTRUCTION OF THE DOCUMENT.
|
||||
// POC: Alex Kravchenko (1118268)
|
||||
//******************************************************************************//
|
||||
|
||||
// Ignore Spelling: Locator
|
||||
|
||||
using CommonServiceLocator;
|
||||
using GalaSoft.MvvmLight;
|
||||
using GalaSoft.MvvmLight.Ioc;
|
||||
using GalaSoft.MvvmLight.Messaging;
|
||||
using Raytheon.LogDashboard.Model;
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Windows;
|
||||
using System.Windows.Media;
|
||||
|
||||
namespace Raytheon.LogDashboard.ViewModel
|
||||
{
|
||||
public class LogDashViewModelLocator : ViewModelBase
|
||||
{
|
||||
public LogDashViewModelLocator()
|
||||
{
|
||||
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
|
||||
|
||||
SimpleIoc.Default.Register<LogDashboardViewModel>();
|
||||
SimpleIoc.Default.Register<ImportLogsProcessViewModel>();
|
||||
SimpleIoc.Default.Register<LogImportTemplateViewModel>();
|
||||
SimpleIoc.Default.Register<ReleaseNotesViewModel>();
|
||||
SimpleIoc.Default.Register<SearchResultViewModel>();
|
||||
SimpleIoc.Default.Register<SettingsViewModel>();
|
||||
SimpleIoc.Default.Register<SelectTimeIntervalViewModel>();
|
||||
SimpleIoc.Default.Register<SidebarTreeViewModel>();
|
||||
}
|
||||
public static LogDashboardViewModel LogDashboard => ServiceLocator.Current.GetInstance<LogDashboardViewModel>();
|
||||
|
||||
public static ImportLogsProcessViewModel ImportLogsProcess => ServiceLocator.Current.GetInstance<ImportLogsProcessViewModel>();
|
||||
public static LogImportTemplateViewModel LogImportTemplate => ServiceLocator.Current.GetInstance<LogImportTemplateViewModel>();
|
||||
public static ReleaseNotesViewModel ReleaseNotes => ServiceLocator.Current.GetInstance<ReleaseNotesViewModel>();
|
||||
public static SearchResultViewModel SearchResult => ServiceLocator.Current.GetInstance<SearchResultViewModel>();
|
||||
public static SettingsViewModel Settings => ServiceLocator.Current.GetInstance<SettingsViewModel>();
|
||||
public static SelectTimeIntervalViewModel SelectTimeInterval => ServiceLocator.Current.GetInstance<SelectTimeIntervalViewModel>();
|
||||
public static SidebarTreeViewModel SidebarTree => ServiceLocator.Current.GetInstance<SidebarTreeViewModel>();
|
||||
|
||||
public static ColorTheme AccentColorTheme { get; set; } = new ColorTheme { Name = "BaseLight", Color = new SolidColorBrush(Colors.Black) };
|
||||
public static ColorTheme InvertAccentColorTheme { get; set; } = new ColorTheme { Name = "BaseDark", Color = new SolidColorBrush(Colors.White) };
|
||||
|
||||
private ColorTheme selectedColorTheme;
|
||||
public ColorTheme SelectedColorTheme
|
||||
{
|
||||
get => selectedColorTheme ?? (selectedColorTheme = new ColorTheme { Color = new SolidColorBrush(Colors.Cyan), Name = "Cyan" });
|
||||
set
|
||||
{
|
||||
if(selectedColorTheme?.Name != value?.Name)
|
||||
{
|
||||
Set(() => SelectedColorTheme, ref selectedColorTheme, value);
|
||||
Messenger.Default.Send(value.Name, "ColorChange");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private string selectedTheme;
|
||||
public string SelectedTheme
|
||||
{
|
||||
get => selectedTheme;
|
||||
set
|
||||
{
|
||||
if(selectedTheme != value)
|
||||
{
|
||||
var accentTheme = AccentColorTheme;
|
||||
var invertTheme = InvertAccentColorTheme;
|
||||
SwapReferences(ref accentTheme, ref invertTheme);
|
||||
AccentColorTheme = accentTheme;
|
||||
InvertAccentColorTheme = invertTheme;
|
||||
|
||||
Set(() => SelectedTheme, ref selectedTheme, value);
|
||||
|
||||
Messenger.Default.Send(value, "ThemeChange");
|
||||
}
|
||||
}
|
||||
}
|
||||
private static void SwapReferences(ref ColorTheme theme1, ref ColorTheme theme2)
|
||||
{
|
||||
(theme1, theme2) = (theme2, theme1);
|
||||
}
|
||||
|
||||
public string ErrorLogger32DefaultLocation => Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Raytheon", "ErrorLogger", "ErrorLogger.ini");
|
||||
public string ErrorLogger64DefaultLocation => Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Raytheon", "ErrorLogger64", "ErrorLogger64.ini");
|
||||
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,648 @@
|
||||
//******************************************************************************//
|
||||
// LogImportTemplateViewModel.cs
|
||||
// 12/4/2023
|
||||
//
|
||||
// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
// PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
// AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
// UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
// RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
// CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
// OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
// COMPANY.
|
||||
//
|
||||
// THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
//
|
||||
// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
//
|
||||
// WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
// EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
// BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
// 120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
// 730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
// OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
// LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
// BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
// APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
// PENALTIES.
|
||||
//
|
||||
// DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
// FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
// INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
// DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
// RECONSTRUCTION OF THE DOCUMENT.
|
||||
// POC: Alex Kravchenko (1118268)
|
||||
//******************************************************************************//
|
||||
using NLog.LayoutRenderers;
|
||||
using NLog.Layouts;
|
||||
using NLog;
|
||||
using Raytheon.LogDashboard.Helpers;
|
||||
using Raytheon.LogDashboard.Model;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.Globalization;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Runtime.Serialization;
|
||||
using System.Text;
|
||||
using System.Windows;
|
||||
using System.Xml.Serialization;
|
||||
using GalaSoft.MvvmLight;
|
||||
using GalaSoft.MvvmLight.CommandWpf;
|
||||
using GalaSoft.MvvmLight.Ioc;
|
||||
using GalaSoft.MvvmLight.Messaging;
|
||||
|
||||
namespace Raytheon.LogDashboard.ViewModel
|
||||
{
|
||||
[Serializable]
|
||||
[DataContract]
|
||||
public class LogImportTemplateViewModel : ViewModelBase
|
||||
{
|
||||
private static readonly Logger logger = LogManager.GetCurrentClassLogger();
|
||||
private string settingsPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "LogDashboard", "template_import_settings.xml");
|
||||
|
||||
private string importFilePath = string.Empty;
|
||||
private string templateSeparator = ";";
|
||||
private string selectedEncoding = "UTF-8";
|
||||
private bool? dialogResult;
|
||||
private bool needUpdateFile;
|
||||
private string templateString = "${longdate};${level};${callsite};${logger};${message};${exception:format=tostring}";
|
||||
protected static LogDashViewModelLocator LocatorInstance => (Application.Current.Resources["LogDashLocator"] as LogDashViewModelLocator);
|
||||
|
||||
#region Properties
|
||||
[XmlIgnore]
|
||||
public Dictionary<string, List<ImportTemplateParameters>> PopularTemplates { get; set; } = new Dictionary<string, List<ImportTemplateParameters>>();
|
||||
|
||||
[XmlElement(Order = 7)]
|
||||
public List<ImportTemplateParameters> SelectedPopularTemplate { get; set; }
|
||||
|
||||
[XmlElement(Order = 8)]
|
||||
public ObservableCollection<LogTemplateItem> TemplateLogItems { get; set; } = new ObservableCollection<LogTemplateItem>();
|
||||
|
||||
[XmlElement(Order = 1)]
|
||||
public bool IsAutomaticDetectTemplateSelected { get; set; } = true;
|
||||
[XmlElement(Order = 2)]
|
||||
public bool IsPopularTemplateSelected { get; set; }
|
||||
[XmlElement(Order = 3)]
|
||||
public bool IsUserTemplateSelected { get; set; }
|
||||
[XmlElement(Order = 4)]
|
||||
public bool IsLayoutStringTemplateSelected { get; set; }
|
||||
|
||||
[XmlIgnore]
|
||||
public bool? DialogResult
|
||||
{
|
||||
get => dialogResult;
|
||||
set => Set(() => DialogResult, ref dialogResult, value);
|
||||
}
|
||||
|
||||
[XmlIgnore]
|
||||
public LogTemplate LogTemplate { get; private set; } = new LogTemplate();
|
||||
|
||||
[XmlElement(Order = 5)]
|
||||
public string TemplateString
|
||||
{
|
||||
get => templateString;
|
||||
set => Set(() => TemplateString, ref templateString, value);
|
||||
}
|
||||
|
||||
[XmlElement(Order = 6)]
|
||||
public string TemplateSeparator
|
||||
{
|
||||
get => templateSeparator;
|
||||
set => Set(() => TemplateSeparator, ref templateSeparator, value);
|
||||
}
|
||||
|
||||
[XmlElement(Order = 9)]
|
||||
public bool NeedUpdateFile
|
||||
{
|
||||
get => needUpdateFile;
|
||||
set => Set(() => NeedUpdateFile, ref needUpdateFile, value);
|
||||
}
|
||||
|
||||
[XmlElement(Order = 10)]
|
||||
public string SelectedEncoding
|
||||
{
|
||||
get => selectedEncoding;
|
||||
set => Set(() => SelectedEncoding, ref selectedEncoding, value);
|
||||
}
|
||||
|
||||
[XmlIgnore]
|
||||
public string ImportPath
|
||||
{
|
||||
get => importFilePath;
|
||||
set => SetPath(value);
|
||||
}
|
||||
|
||||
|
||||
#endregion
|
||||
|
||||
#region Commands
|
||||
|
||||
public RelayCommand OkCommand { get; set; }
|
||||
public RelayCommand AddTemplateItemCommand { get; set; }
|
||||
public RelayCommand<object> RemoveTemplateItemCommand { get; set; }
|
||||
public RelayCommand SaveTemplateSettingsCommand { get; set; }
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
[PreferredConstructor]
|
||||
public LogImportTemplateViewModel()
|
||||
{
|
||||
OkCommand = new RelayCommand(Confirm);
|
||||
AddTemplateItemCommand = new RelayCommand(AddTemplateItem);
|
||||
RemoveTemplateItemCommand = new RelayCommand<object>(RemoveTemplateItem);
|
||||
SaveTemplateSettingsCommand = new RelayCommand(SaveTemplateSettingsToFile);
|
||||
}
|
||||
|
||||
public void SetPath(string path)
|
||||
{
|
||||
importFilePath = path;
|
||||
|
||||
PopularTemplates.Add("${date};${level};${other};${processid};${threadid};${сallsite};${logger};${message}",
|
||||
new List<ImportTemplateParameters>
|
||||
{
|
||||
ImportTemplateParameters.date,
|
||||
ImportTemplateParameters.level,
|
||||
ImportTemplateParameters.other,
|
||||
ImportTemplateParameters.processid,
|
||||
ImportTemplateParameters.threadid,
|
||||
ImportTemplateParameters.сallsite,
|
||||
ImportTemplateParameters.logger,
|
||||
ImportTemplateParameters.message
|
||||
});
|
||||
|
||||
PopularTemplates.Add("${date};${level};${threadid};${сallsite};${logger};${message}",
|
||||
new List<ImportTemplateParameters>
|
||||
{
|
||||
ImportTemplateParameters.date,
|
||||
ImportTemplateParameters.level,
|
||||
ImportTemplateParameters.threadid,
|
||||
ImportTemplateParameters.сallsite,
|
||||
ImportTemplateParameters.logger,
|
||||
ImportTemplateParameters.message
|
||||
});
|
||||
|
||||
PopularTemplates.Add("${date};${level};${threadid};${logger};${message}",
|
||||
new List<ImportTemplateParameters>
|
||||
{
|
||||
ImportTemplateParameters.date,
|
||||
ImportTemplateParameters.level,
|
||||
ImportTemplateParameters.threadid,
|
||||
ImportTemplateParameters.logger,
|
||||
ImportTemplateParameters.message
|
||||
});
|
||||
|
||||
PopularTemplates.Add("${date};${level};${сallsite};${logger};${message}",
|
||||
new List<ImportTemplateParameters>
|
||||
{
|
||||
ImportTemplateParameters.date,
|
||||
ImportTemplateParameters.level,
|
||||
ImportTemplateParameters.сallsite,
|
||||
ImportTemplateParameters.logger,
|
||||
ImportTemplateParameters.message
|
||||
});
|
||||
|
||||
PopularTemplates.Add("${date};${level};${logger};${message}",
|
||||
new List<ImportTemplateParameters>
|
||||
{
|
||||
ImportTemplateParameters.date,
|
||||
ImportTemplateParameters.level,
|
||||
ImportTemplateParameters.logger,
|
||||
ImportTemplateParameters.message
|
||||
});
|
||||
|
||||
PopularTemplates.Add("${longdate}|${level:uppercase=true}|${logger}|${message}",
|
||||
new List<ImportTemplateParameters>
|
||||
{
|
||||
ImportTemplateParameters.longdate,
|
||||
ImportTemplateParameters.level,
|
||||
ImportTemplateParameters.logger,
|
||||
ImportTemplateParameters.message
|
||||
});
|
||||
|
||||
SelectedPopularTemplate = PopularTemplates.First().Value;
|
||||
|
||||
if(!File.Exists(settingsPath) && File.Exists($"{AppDomain.CurrentDomain.BaseDirectory}template_import_settings.xml"))
|
||||
{
|
||||
settingsPath = $"{AppDomain.CurrentDomain.BaseDirectory}template_import_settings.xml";
|
||||
}
|
||||
|
||||
if(File.Exists(settingsPath))
|
||||
{
|
||||
XmlSerializer ser = new XmlSerializer(GetType());
|
||||
try
|
||||
{
|
||||
using(FileStream fs = new FileStream(settingsPath, FileMode.Open))
|
||||
{
|
||||
LogImportTemplateViewModel litvm = (LogImportTemplateViewModel)ser.Deserialize(fs);
|
||||
IsAutomaticDetectTemplateSelected = litvm.IsAutomaticDetectTemplateSelected;
|
||||
IsLayoutStringTemplateSelected = litvm.IsLayoutStringTemplateSelected;
|
||||
IsPopularTemplateSelected = litvm.IsPopularTemplateSelected;
|
||||
IsUserTemplateSelected = litvm.IsUserTemplateSelected;
|
||||
TemplateSeparator = litvm.TemplateSeparator;
|
||||
TemplateString = litvm.TemplateString;
|
||||
NeedUpdateFile = litvm.NeedUpdateFile;
|
||||
SelectedEncoding = litvm.SelectedEncoding;
|
||||
SelectedPopularTemplate = PopularTemplates.FirstOrDefault(x => x.Value.SequenceEqual(litvm.SelectedPopularTemplate)).Value;
|
||||
TemplateLogItems = new ObservableCollection<LogTemplateItem>(litvm.TemplateLogItems);
|
||||
|
||||
foreach(var templateLogItem in TemplateLogItems)
|
||||
{
|
||||
var ltii = templateLogItem.TemplateItems
|
||||
.Cast<LogTemplateItemInfo>()
|
||||
.FirstOrDefault(x => x.Parameter == templateLogItem.SelectedTemplateParameter.Parameter);
|
||||
templateLogItem.SelectedTemplateParameter = ltii;
|
||||
}
|
||||
}
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
logger.Warn(ex, "An error occurred while read template settings");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#region Command Handlers
|
||||
|
||||
private void Confirm()
|
||||
{
|
||||
LogTemplate.Encoding = SelectedEncoding;
|
||||
|
||||
if(IsAutomaticDetectTemplateSelected)
|
||||
{
|
||||
if(!TryGetLogTemplateByAutodetect())
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
else if(IsPopularTemplateSelected)
|
||||
{
|
||||
GetLogTemplateByPopularTemplates();
|
||||
}
|
||||
else if(IsLayoutStringTemplateSelected)
|
||||
{
|
||||
GetLogTemplateByParsingLayoutPattern();
|
||||
}
|
||||
else if(IsUserTemplateSelected)
|
||||
{
|
||||
if(TryGetLogTemplateByUserGeneratedPattern())
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
DialogResult = true;
|
||||
}
|
||||
|
||||
private void AddTemplateItem()
|
||||
{
|
||||
TemplateLogItems.Add(new LogTemplateItem());
|
||||
}
|
||||
|
||||
private void RemoveTemplateItem(object obj)
|
||||
{
|
||||
if(obj is LogTemplateItem item)
|
||||
{
|
||||
TemplateLogItems.Remove(item);
|
||||
}
|
||||
}
|
||||
|
||||
private void SaveTemplateSettingsToFile()
|
||||
{
|
||||
try
|
||||
{
|
||||
XmlSerializer ser = new XmlSerializer(this.GetType());
|
||||
Directory.CreateDirectory(Path.GetDirectoryName(settingsPath));
|
||||
using(FileStream fs = new FileStream(settingsPath, FileMode.Create))
|
||||
{
|
||||
ser.Serialize(fs, this);
|
||||
}
|
||||
|
||||
Messenger.Default.Send("Template settings successfully saved.", "DisplayCustomMessage");
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
Messenger.Default.Send($"Unable to Save Template settings.\n{e.Message}", "DisplayCustomMessage");
|
||||
logger.Warn(e, "An error occurred while Save settings.");
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Templates
|
||||
|
||||
private bool TryGetLogTemplateByAutodetect()
|
||||
{
|
||||
string firstMessage = GetFirstLogMessage();
|
||||
|
||||
if(string.IsNullOrWhiteSpace(firstMessage))
|
||||
{
|
||||
Messenger.Default.Send($"An error occurred while trying to automatically match the message template.\nEmpty data file", "DisplayCustomMessage");
|
||||
return false;
|
||||
}
|
||||
|
||||
if(!TryDetectTemplate(firstMessage))
|
||||
{
|
||||
Messenger.Default.Send($"An error occurred while trying to automatically match the message template.", "DisplayCustomMessage");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
private bool TryGetLogTemplateByUserGeneratedPattern()
|
||||
{
|
||||
LogTemplate.Separator = TemplateSeparator;
|
||||
for(int i = 0; i < TemplateLogItems.Count; i++)
|
||||
{
|
||||
try
|
||||
{
|
||||
LogTemplate.TemplateParameters.Add(TemplateLogItems[i].SelectedTemplateParameter.Parameter, i);
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
LogTemplate.TemplateParameters.Clear();
|
||||
Messenger.Default.Send($"Unable to Add Template\n{ex.Message}", "DisplayCustomMessage");
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
private void GetLogTemplateByPopularTemplates()
|
||||
{
|
||||
for(int i = 0; i < SelectedPopularTemplate.Count; i++)
|
||||
{
|
||||
LogTemplate.TemplateParameters.Add(SelectedPopularTemplate[i], i);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
private void GetLogTemplateByParsingLayoutPattern()
|
||||
{
|
||||
SimpleLayout layout = new SimpleLayout(TemplateString);
|
||||
List<LayoutRenderer> elements = layout.Renderers.Where(x => !(x is LiteralLayoutRenderer)).ToList();
|
||||
|
||||
if(elements.Count < 4)
|
||||
{
|
||||
Messenger.Default.Send($"An error occurred while parsing template string", "DisplayCustomMessage");
|
||||
return;
|
||||
}
|
||||
|
||||
var separator = layout.Renderers.FirstOrDefault(x => x is LiteralLayoutRenderer);
|
||||
|
||||
LogTemplate.Separator = separator != null ? separator.Render(LogEventInfo.CreateNullEvent()) : ";";
|
||||
|
||||
List<string> tElements = TemplateString.Split(new[] { LogTemplate.Separator }, StringSplitOptions.None)
|
||||
.Where(x => !string.IsNullOrEmpty(x)).ToList();
|
||||
|
||||
int j = 0;
|
||||
for(int i = 0; i < tElements.Count; i++)
|
||||
{
|
||||
int modifyIndex = tElements[i].IndexOf(":");
|
||||
if(modifyIndex > 0)
|
||||
{
|
||||
tElements[i] = tElements[i].Substring(0, modifyIndex);
|
||||
}
|
||||
|
||||
tElements[i] = tElements[i].Replace("}", "");
|
||||
|
||||
if(j <= elements.Count)
|
||||
{
|
||||
string layoutRender = elements[j].ToString();
|
||||
if(!layoutRender.Contains(tElements[i]))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if(elements[j] is LevelLayoutRenderer)
|
||||
{
|
||||
LogTemplate.TemplateParameters.Add(ImportTemplateParameters.level, i);
|
||||
}
|
||||
|
||||
if(elements[j] is CallSiteLayoutRenderer)
|
||||
{
|
||||
LogTemplate.TemplateParameters.Add(ImportTemplateParameters.сallsite, i);
|
||||
}
|
||||
|
||||
if(elements[j] is MessageLayoutRenderer)
|
||||
{
|
||||
LogTemplate.TemplateParameters.Add(ImportTemplateParameters.message, i);
|
||||
}
|
||||
|
||||
if(elements[j] is ThreadIdLayoutRenderer)
|
||||
{
|
||||
LogTemplate.TemplateParameters.Add(ImportTemplateParameters.threadid, i);
|
||||
}
|
||||
|
||||
if(elements[j] is ProcessIdLayoutRenderer)
|
||||
{
|
||||
LogTemplate.TemplateParameters.Add(ImportTemplateParameters.processid, i);
|
||||
}
|
||||
|
||||
if(elements[j] is LoggerNameLayoutRenderer)
|
||||
{
|
||||
LogTemplate.TemplateParameters.Add(ImportTemplateParameters.logger, i);
|
||||
}
|
||||
|
||||
if(elements[j] is TimeLayoutRenderer || elements[j] is DateLayoutRenderer ||
|
||||
elements[j] is LongDateLayoutRenderer || elements[j] is ShortDateLayoutRenderer)
|
||||
{
|
||||
LogTemplate.TemplateParameters.Add(ImportTemplateParameters.date, i);
|
||||
}
|
||||
|
||||
if(elements[j] is TicksLayoutRenderer)
|
||||
{
|
||||
LogTemplate.TemplateParameters.Add(ImportTemplateParameters.ticks, i);
|
||||
}
|
||||
|
||||
j++;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
private string GetFirstLogMessage()
|
||||
{
|
||||
string[] logTypeArraySeparator1 =
|
||||
{
|
||||
";Fatal;", ";Error;", ";Warn;", ";Trace;", ";Debug;", ";Info;",
|
||||
";Fatal", ";Error", ";Warn", ";Trace", ";Debug", ";Info",
|
||||
"Fatal;", "Error;", "Warn;", "Trace;", "Debug;", "Info;"
|
||||
};
|
||||
|
||||
string[] logTypeArraySeparator2 =
|
||||
{
|
||||
"|Fatal|", "|Error|", "|Warn|", "|Trace|", "|Debug|", "|Info|",
|
||||
"|Fatal", "|Error", "|Warn", "|Trace", "|Debug", "|Info",
|
||||
"Fatal|", "Error|", "Warn|", "Trace|", "Debug|", "Info|"
|
||||
};
|
||||
|
||||
StringBuilder sb = new StringBuilder();
|
||||
using(StreamReader reader = new StreamReader(importFilePath))
|
||||
{
|
||||
string line;
|
||||
while((line = reader.ReadLine()) != null)
|
||||
{
|
||||
if(line.ContainsAnyOf(logTypeArraySeparator1, true) || line.ContainsAnyOf(logTypeArraySeparator2, true))
|
||||
{
|
||||
if(sb.Length != 0)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
sb.Append(line);
|
||||
}
|
||||
else
|
||||
{
|
||||
sb.AppendLine(line);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return sb.ToString();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// trying to detect template
|
||||
/// </summary>
|
||||
/// <param name="log"></param>
|
||||
/// <returns></returns>
|
||||
private bool TryDetectTemplate(string log)
|
||||
{
|
||||
if(log.StartsWith("<log4j"))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
string[] logSplit = log.Split(';');
|
||||
if(logSplit.Length < 4)
|
||||
{
|
||||
logSplit = log.Split('|');
|
||||
LogTemplate.Separator = "|";
|
||||
}
|
||||
|
||||
ImportTemplateParameters dataParameter = ImportTemplateParameters.date;
|
||||
|
||||
int dateTimeIndex = GetDateTimeIndex(logSplit, ref dataParameter);
|
||||
if(dateTimeIndex == -1)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
var intIndexes = GetIntIndexes(logSplit);
|
||||
int logLevelIndex = GetLogLevelIndex(logSplit);
|
||||
if(dateTimeIndex == -1)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
List<int> otherIndexes = new List<int>();
|
||||
|
||||
for(int i = 0; i < logSplit.Length; i++)
|
||||
{
|
||||
|
||||
if(i == dateTimeIndex || i == logLevelIndex || intIndexes.Contains(i))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if(!string.IsNullOrEmpty(logSplit[i]))
|
||||
{
|
||||
otherIndexes.Add(i);
|
||||
}
|
||||
}
|
||||
|
||||
if(otherIndexes.Count < 2)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
LogTemplate.TemplateParameters.Add(dataParameter, dateTimeIndex);
|
||||
LogTemplate.TemplateParameters.Add(ImportTemplateParameters.level, logLevelIndex);
|
||||
LogTemplate.TemplateParameters.Add(ImportTemplateParameters.message, otherIndexes[1]);
|
||||
LogTemplate.TemplateParameters.Add(ImportTemplateParameters.logger, otherIndexes.First());
|
||||
|
||||
if(intIndexes.Count > 0)
|
||||
{
|
||||
LogTemplate.TemplateParameters.Add(ImportTemplateParameters.threadid, intIndexes.Last());
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private int GetDateTimeIndex(string[] logSplit, ref ImportTemplateParameters dateTemplateParameter)
|
||||
{
|
||||
int index = -1;
|
||||
for(int i = 0; i < logSplit.Length; i++)
|
||||
{
|
||||
if(DateTime.TryParse(logSplit[i], out DateTime date))
|
||||
{
|
||||
return i;
|
||||
}
|
||||
|
||||
if(DateTime.TryParseExact(logSplit[i], "MM-dd-y HH:mm:ss.ffff", CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime dt))
|
||||
{
|
||||
return i;
|
||||
}
|
||||
|
||||
if(long.TryParse(logSplit[i], out long tickDateTime))
|
||||
{
|
||||
try
|
||||
{
|
||||
DateTime dateFromTicks = new DateTime(tickDateTime);
|
||||
dateTemplateParameter = ImportTemplateParameters.ticks;
|
||||
return i;
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
logger.Warn(e, "An error occurred while getting date time index.");
|
||||
}
|
||||
}
|
||||
}
|
||||
return index;
|
||||
}
|
||||
|
||||
private List<int> GetIntIndexes(string[] logSplit)
|
||||
{
|
||||
List<int> indexes = new List<int>();
|
||||
for(int i = 0; i < logSplit.Length; i++)
|
||||
{
|
||||
if(int.TryParse(logSplit[i], out int number))
|
||||
{
|
||||
indexes.Add(i);
|
||||
}
|
||||
}
|
||||
|
||||
return indexes;
|
||||
}
|
||||
|
||||
private int GetLogLevelIndex(string[] logSplit)
|
||||
{
|
||||
int index = -1;
|
||||
for(int i = 0; i < logSplit.Length; i++)
|
||||
{
|
||||
if(Enum.TryParse(logSplit[i].ToPascalCase(), out DashboardLogLevel level))
|
||||
{
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return index;
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,91 @@
|
||||
//******************************************************************************//
|
||||
// ReleaseNotesViewModel.cs
|
||||
// 12/4/2023
|
||||
//
|
||||
// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
// PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
// AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
// UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
// RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
// CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
// OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
// COMPANY.
|
||||
//
|
||||
// THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
//
|
||||
// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
//
|
||||
// WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
// EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
// BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
// 120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
// 730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
// OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
// LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
// BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
// APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
// PENALTIES.
|
||||
//
|
||||
// DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
// FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
// INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
// DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
// RECONSTRUCTION OF THE DOCUMENT.
|
||||
// POC: Alex Kravchenko (1118268)
|
||||
//******************************************************************************//
|
||||
using GalaSoft.MvvmLight;
|
||||
using NLog;
|
||||
using Raytheon.LogDashboard.Model;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Windows;
|
||||
using System.Windows.Media;
|
||||
using System.Xml.Serialization;
|
||||
|
||||
namespace Raytheon.LogDashboard.ViewModel
|
||||
{
|
||||
public class ReleaseNotesViewModel : ViewModelBase
|
||||
{
|
||||
private static readonly Logger logger = LogManager.GetCurrentClassLogger();
|
||||
protected static LogDashViewModelLocator LocatorInstance => (Application.Current.Resources["LogDashLocator"] as LogDashViewModelLocator);
|
||||
|
||||
public List<ReleaseNotes> ReleaseNotesList { get; set; } = new List<ReleaseNotes>();
|
||||
|
||||
public ReleaseNotesViewModel()
|
||||
{
|
||||
string releaseNotesPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "ReleaseNotes.xml");
|
||||
|
||||
if(File.Exists(releaseNotesPath))
|
||||
{
|
||||
try
|
||||
{
|
||||
XmlSerializer ser = new XmlSerializer(ReleaseNotesList.GetType());
|
||||
using(FileStream fs = new FileStream(releaseNotesPath, FileMode.Open, FileAccess.Read))
|
||||
{
|
||||
ReleaseNotesList = (List<ReleaseNotes>)ser.Deserialize(fs);
|
||||
}
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
logger.Warn(e, "An error occurred while read Release Notes file.");
|
||||
}
|
||||
}
|
||||
|
||||
if(ReleaseNotesList.Any())
|
||||
{
|
||||
ReleaseNotesList.First().IsExpanded = true;
|
||||
}
|
||||
}
|
||||
public SolidColorBrush IconColor
|
||||
{
|
||||
get => SelectedColorTheme.Color;
|
||||
}
|
||||
public ColorTheme SelectedColorTheme
|
||||
{
|
||||
get => LocatorInstance.SelectedColorTheme;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,74 @@
|
||||
//******************************************************************************//
|
||||
// SearchResultViewModel.cs
|
||||
// 12/4/2023
|
||||
//
|
||||
// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
// PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
// AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
// UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
// RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
// CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
// OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
// COMPANY.
|
||||
//
|
||||
// THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
//
|
||||
// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
//
|
||||
// WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
// EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
// BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
// 120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
// 730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
// OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
// LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
// BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
// APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
// PENALTIES.
|
||||
//
|
||||
// DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
// FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
// INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
// DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
// RECONSTRUCTION OF THE DOCUMENT.
|
||||
// POC: Alex Kravchenko (1118268)
|
||||
//******************************************************************************//
|
||||
using GalaSoft.MvvmLight;
|
||||
using GalaSoft.MvvmLight.CommandWpf;
|
||||
using Raytheon.LogDashboard.Model;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.Windows;
|
||||
|
||||
namespace Raytheon.LogDashboard.ViewModel
|
||||
{
|
||||
public class SearchResultViewModel : ViewModelBase
|
||||
{
|
||||
private LogMessage selectedLog;
|
||||
|
||||
public ObservableCollection<LogMessage> SearchResult { get; set; } = new ObservableCollection<LogMessage>();
|
||||
|
||||
public LogMessage SelectedLog
|
||||
{
|
||||
get => selectedLog;
|
||||
set => Set(() => SelectedLog, ref selectedLog, value);
|
||||
}
|
||||
|
||||
public string HighlightSearchText { get; set; }
|
||||
|
||||
public bool IsMatchCase { get; set; }
|
||||
|
||||
private RelayCommand copyMessageCommand;
|
||||
|
||||
public RelayCommand CopyMessageCommand => copyMessageCommand ?? (copyMessageCommand = new RelayCommand(CopyMessage));
|
||||
|
||||
private void CopyMessage()
|
||||
{
|
||||
if(SelectedLog == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
Clipboard.SetDataObject(SelectedLog.Message);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,77 @@
|
||||
//******************************************************************************//
|
||||
// SelectTimeIntervalViewModel.cs
|
||||
// 12/4/2023
|
||||
//
|
||||
// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
// PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
// AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
// UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
// RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
// CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
// OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
// COMPANY.
|
||||
//
|
||||
// THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
//
|
||||
// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
//
|
||||
// WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
// EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
// BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
// 120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
// 730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
// OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
// LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
// BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
// APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
// PENALTIES.
|
||||
//
|
||||
// DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
// FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
// INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
// DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
// RECONSTRUCTION OF THE DOCUMENT.
|
||||
// POC: Alex Kravchenko (1118268)
|
||||
//******************************************************************************//
|
||||
using GalaSoft.MvvmLight;
|
||||
using System;
|
||||
using System.Windows.Media;
|
||||
using System.Windows;
|
||||
using Raytheon.LogDashboard.Helpers;
|
||||
using Raytheon.LogDashboard.Model;
|
||||
|
||||
namespace Raytheon.LogDashboard.ViewModel
|
||||
{
|
||||
public class SelectTimeIntervalViewModel : ViewModelBase
|
||||
{
|
||||
protected static LogDashViewModelLocator LocatorInstance => (Application.Current.Resources["LogDashLocator"] as LogDashViewModelLocator);
|
||||
|
||||
public void SetSelectTimeInterval(DateTime? currentLogDateTime)
|
||||
{
|
||||
if(currentLogDateTime.HasValue)
|
||||
{
|
||||
_selectedDateTimeFrom = currentLogDateTime.Value;
|
||||
_selectedDateTimeTo = currentLogDateTime.Value;
|
||||
}
|
||||
}
|
||||
|
||||
public ColorTheme SelectedColorTheme
|
||||
{
|
||||
get => LocatorInstance.SelectedColorTheme;
|
||||
}
|
||||
|
||||
private DateTime _selectedDateTimeFrom = DateTime.Now;
|
||||
public DateTime SelectedDateTimeFrom
|
||||
{
|
||||
get => _selectedDateTimeFrom;
|
||||
set => Set(() => SelectedDateTimeFrom, ref _selectedDateTimeFrom, value);
|
||||
}
|
||||
|
||||
private DateTime _selectedDateTimeTo = DateTime.Now;
|
||||
public DateTime SelectedDateTimeTo
|
||||
{
|
||||
get => _selectedDateTimeTo;
|
||||
set => Set(() => SelectedDateTimeTo, ref _selectedDateTimeTo, value);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,832 @@
|
||||
//******************************************************************************//
|
||||
// SettingsViewModel.cs
|
||||
// 12/4/2023
|
||||
//
|
||||
// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
// PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
// AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
// UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
// RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
// CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
// OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
// COMPANY.
|
||||
//
|
||||
// THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
//
|
||||
// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
//
|
||||
// WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
// EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
// BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
// 120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
// 730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
// OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
// LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
// BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
// APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
// PENALTIES.
|
||||
//
|
||||
// DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
// FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
// INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
// DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
// RECONSTRUCTION OF THE DOCUMENT.
|
||||
// POC: Alex Kravchenko (1118268)
|
||||
//******************************************************************************//
|
||||
|
||||
// Ignore Spelling: Taskbar
|
||||
|
||||
using NLog;
|
||||
using Raytheon.LogDashboard.Helpers;
|
||||
using Raytheon.LogDashboard.Model;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Web.UI.WebControls;
|
||||
using System.Windows.Media;
|
||||
using System.Windows;
|
||||
using GalaSoft.MvvmLight;
|
||||
using GalaSoft.MvvmLight.CommandWpf;
|
||||
using Raytheon.LogDashboard.View;
|
||||
using Settings = Raytheon.LogDashboard.Model.Settings;
|
||||
using GalaSoft.MvvmLight.Messaging;
|
||||
using System.Threading.Tasks;
|
||||
using System.IO;
|
||||
using System.Collections.Concurrent;
|
||||
using System.Threading;
|
||||
using System.Text.RegularExpressions;
|
||||
using Raytheon.Common;
|
||||
using Microsoft.WindowsAPICodePack.Dialogs;
|
||||
|
||||
namespace Raytheon.LogDashboard.ViewModel
|
||||
{
|
||||
public class SettingsViewModel : ViewModelBase
|
||||
{
|
||||
private static readonly Logger logger = LogManager.GetCurrentClassLogger();
|
||||
|
||||
private ObservableCollection<Receiver> receivers = new ObservableCollection<Receiver>();
|
||||
private ObservableCollection<IgnoredIPAddr> ignoredIpAdresses = new ObservableCollection<IgnoredIPAddr>();
|
||||
|
||||
private const string ErrorLogger32DefaultLocation = @"%AppData%\Raytheon\ErrorLogger\ErrorLogger.ini";
|
||||
private const string ErrorLogger64DefaultLocation = @"%AppData%\Raytheon\ErrorLogger64\ErrorLogger64.ini";
|
||||
|
||||
protected static LogDashViewModelLocator LocatorInstance => (Application.Current.Resources["LogDashLocator"] as LogDashViewModelLocator);
|
||||
|
||||
private CancellationTokenSource _ctsPersistingLogMessages;
|
||||
private readonly ConcurrentQueue<LogMessage> _persistingLogQueue = new ConcurrentQueue<LogMessage>();
|
||||
private FileSystemWatcher _errorLoggerWatcher;
|
||||
|
||||
private string currentThemeName = string.Empty;
|
||||
|
||||
#region Properties
|
||||
|
||||
public ObservableCollection<Receiver> Receivers
|
||||
{
|
||||
get => new ObservableCollection<Receiver>(receivers.Where(r => !r.IsHidden));
|
||||
set => Set(() => Receivers, ref receivers, value);
|
||||
}
|
||||
public ObservableCollection<IgnoredIPAddr> IgnoredIPAddresses
|
||||
{
|
||||
get => ignoredIpAdresses;
|
||||
set
|
||||
{
|
||||
if(value != null)
|
||||
{
|
||||
ignoredIpAdresses = new ObservableCollection<IgnoredIPAddr>(value.OrderBy(x => x.IP));
|
||||
RaisePropertyChanged();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private bool isConfigurationVisible = false;
|
||||
public bool IsConfigurationVisible
|
||||
{
|
||||
get => isConfigurationVisible;
|
||||
set => Set(() => IsConfigurationVisible, ref isConfigurationVisible, value);
|
||||
}
|
||||
|
||||
private bool isAutoStartReadAtStartup = true;
|
||||
public bool IsAutoStartReadAtStartup
|
||||
{
|
||||
get => isAutoStartReadAtStartup;
|
||||
set => Set(() => IsAutoStartReadAtStartup, ref isAutoStartReadAtStartup, value);
|
||||
}
|
||||
|
||||
private bool minimizeToTray = false;
|
||||
public bool MinimizeToTray
|
||||
{
|
||||
get => minimizeToTray;
|
||||
set => Set(() => MinimizeToTray, ref minimizeToTray, value);
|
||||
}
|
||||
|
||||
private bool isEnableMaxMessageBufferSize = false;
|
||||
public bool IsEnableMaxMessageBufferSize
|
||||
{
|
||||
get => isEnableMaxMessageBufferSize;
|
||||
set => Set(() => IsEnableMaxMessageBufferSize, ref isEnableMaxMessageBufferSize, value);
|
||||
}
|
||||
|
||||
private int maxMessageBufferSize;
|
||||
public int MaxMessageBufferSize
|
||||
{
|
||||
get => maxMessageBufferSize;
|
||||
set => Set(() => MaxMessageBufferSize, ref maxMessageBufferSize, value);
|
||||
}
|
||||
|
||||
private int deletedMessagesCount;
|
||||
public int DeletedMessagesCount
|
||||
{
|
||||
get => deletedMessagesCount;
|
||||
set
|
||||
{
|
||||
if(value >= MaxMessageBufferSize)
|
||||
{
|
||||
deletedMessagesCount = MaxMessageBufferSize;
|
||||
}
|
||||
|
||||
if(value <= 0)
|
||||
{
|
||||
deletedMessagesCount = 1;
|
||||
}
|
||||
|
||||
if(value > 0 && value < MaxMessageBufferSize)
|
||||
{
|
||||
deletedMessagesCount = value;
|
||||
}
|
||||
|
||||
RaisePropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private bool onlyOneAppInstance = true;
|
||||
public bool OnlyOneAppInstance
|
||||
{
|
||||
get => onlyOneAppInstance;
|
||||
set => Set(() => OnlyOneAppInstance, ref onlyOneAppInstance, value);
|
||||
}
|
||||
|
||||
private string displayedDataFormat = "MM/dd/yyyy HH:mm:ss.fff";
|
||||
public string DisplayedDataFormat
|
||||
{
|
||||
get => displayedDataFormat;
|
||||
set => Set(() => DisplayedDataFormat, ref displayedDataFormat, value);
|
||||
}
|
||||
|
||||
private string typedIP;
|
||||
public string TypedIP
|
||||
{
|
||||
get => typedIP;
|
||||
set => Set(() => TypedIP, ref typedIP, value);
|
||||
}
|
||||
|
||||
private IgnoredIPAddr selectedIP;
|
||||
public IgnoredIPAddr SelectedIP
|
||||
{
|
||||
get => selectedIP;
|
||||
set => Set(() => SelectedIP, ref selectedIP, value);
|
||||
}
|
||||
|
||||
private Receiver selectedReceiver;
|
||||
public Receiver SelectedReceiver
|
||||
{
|
||||
get => selectedReceiver;
|
||||
set
|
||||
{
|
||||
selectedReceiver = value;
|
||||
IsConfigurationVisible = selectedReceiver != null;
|
||||
RaisePropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
public static List<ColorTheme> ColorThemes => Settings.ColorThemes;
|
||||
public static List<string> Themes => Settings.Themes;
|
||||
|
||||
public string ExampleDateTime { get; set; }
|
||||
|
||||
public List<string> DataFormats { get; set; } = new List<string>
|
||||
{
|
||||
"MM/dd/yyyy HH:mm",
|
||||
"MM/dd/yyyy HH:mm:ss",
|
||||
"MM/dd/yyyy HH:mm:ss.fff",
|
||||
"HH:mm",
|
||||
"HH:mm:ss",
|
||||
"HH:mm:ss.fff",
|
||||
"MM/dd/yyyy"
|
||||
};
|
||||
|
||||
private string selectedDataFormat;
|
||||
public string SelectedDataFormat
|
||||
{
|
||||
get => selectedDataFormat;
|
||||
set
|
||||
{
|
||||
selectedDataFormat = value;
|
||||
ExampleDateTime = DateTime.Now.ToString(selectedDataFormat);
|
||||
RaisePropertyChanged(nameof(ExampleDateTime));
|
||||
RaisePropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
public string SelectedTheme
|
||||
{
|
||||
get => LocatorInstance.SelectedTheme;
|
||||
set => LocatorInstance.SelectedTheme = value;
|
||||
}
|
||||
|
||||
public int SelectedColorIndex
|
||||
{
|
||||
get => ColorThemes.FindIndex(c => c.Name == SelectedColorTheme.Name);
|
||||
set => SelectedColorTheme = ColorThemes[value];
|
||||
}
|
||||
|
||||
public ColorTheme SelectedColorTheme
|
||||
{
|
||||
get => LocatorInstance.SelectedColorTheme;
|
||||
set
|
||||
{
|
||||
LocatorInstance.SelectedColorTheme = value;
|
||||
RaisePropertyChanged(() => IconColor);
|
||||
}
|
||||
}
|
||||
public SolidColorBrush IconColor
|
||||
{
|
||||
get => SelectedColorTheme.Color;
|
||||
}
|
||||
|
||||
private bool isShowSourceColumn;
|
||||
public bool IsShowSourceColumn
|
||||
{
|
||||
get => isShowSourceColumn;
|
||||
set => Set(() => IsShowSourceColumn, ref isShowSourceColumn, value);
|
||||
}
|
||||
|
||||
private bool isShowThreadColumn;
|
||||
public bool IsShowThreadColumn
|
||||
{
|
||||
get => isShowThreadColumn;
|
||||
set => Set(() => IsShowThreadColumn, ref isShowThreadColumn, value);
|
||||
}
|
||||
|
||||
private bool isShowTaskbarProgress;
|
||||
public bool IsShowTaskbarProgress
|
||||
{
|
||||
get => isShowTaskbarProgress;
|
||||
set => Set(() => IsShowTaskbarProgress, ref isShowTaskbarProgress, value);
|
||||
}
|
||||
|
||||
private bool showMessageHighlightByReceiverColor;
|
||||
public bool ShowMessageHighlightByReceiverColor
|
||||
{
|
||||
get => showMessageHighlightByReceiverColor;
|
||||
set => Set(() => ShowMessageHighlightByReceiverColor, ref showMessageHighlightByReceiverColor, value);
|
||||
}
|
||||
|
||||
private bool isSeparateIPLoggersByPort;
|
||||
public bool IsSeparateIPLoggersByPort
|
||||
{
|
||||
get => isSeparateIPLoggersByPort;
|
||||
set => Set(() => IsSeparateIPLoggersByPort, ref isSeparateIPLoggersByPort, value);
|
||||
}
|
||||
|
||||
private bool isErrorLogger;
|
||||
public bool IsErrorLogger
|
||||
{
|
||||
get => isErrorLogger;
|
||||
set
|
||||
{
|
||||
Set(() => IsErrorLogger, ref isErrorLogger, value);
|
||||
RaisePropertyChanged(nameof(IsAutoSaveEnabled));
|
||||
}
|
||||
}
|
||||
|
||||
public string Version { get; set; } = Assembly.GetExecutingAssembly().GetName().Version.ToString();
|
||||
|
||||
public bool EmbeddedMode { get => !Settings.Instance.EmbeddedMode; }
|
||||
|
||||
private bool isAutoSave;
|
||||
public bool IsAutoSave
|
||||
{
|
||||
get => isAutoSave;
|
||||
set
|
||||
{
|
||||
Set(() => IsAutoSave, ref isAutoSave, value);
|
||||
RaisePropertyChanged(nameof(IsAutoSaveEnabled));
|
||||
}
|
||||
}
|
||||
|
||||
public bool IsAutoSaveEnabled
|
||||
{
|
||||
get => isAutoSave && !IsErrorLogger;
|
||||
}
|
||||
|
||||
private string autoSaveLocation;
|
||||
public string AutoSaveLocation
|
||||
{
|
||||
get => autoSaveLocation;
|
||||
set => Set(() => AutoSaveLocation, ref autoSaveLocation, value);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
public SettingsViewModel()
|
||||
{
|
||||
//ParseTheme();
|
||||
|
||||
Messenger.Default.Register<LogMessage>(this, "PersistLogMessage", PersistLogMessage);
|
||||
|
||||
try
|
||||
{
|
||||
Receivers = new ObservableCollection<Receiver>(Settings.Instance.Receivers);
|
||||
IgnoredIPAddresses = new ObservableCollection<IgnoredIPAddr>(Settings.Instance.IgnoredIPs);
|
||||
IsAutoStartReadAtStartup = Settings.Instance.AutoStartInStartup;
|
||||
MinimizeToTray = Settings.Instance.MinimizeToTray;
|
||||
OnlyOneAppInstance = Settings.Instance.OnlyOneAppInstance;
|
||||
SelectedDataFormat = Settings.Instance.DataFormat;
|
||||
DisplayedDataFormat = Settings.Instance.DataFormat;
|
||||
IsEnableMaxMessageBufferSize = Settings.Instance.IsEnabledMaxMessageBufferSize;
|
||||
MaxMessageBufferSize = Settings.Instance.MaxMessageBufferSize;
|
||||
DeletedMessagesCount = Settings.Instance.DeletedMessagesCount;
|
||||
ExampleDateTime = DateTime.Now.ToString(DisplayedDataFormat);
|
||||
IsShowSourceColumn = Settings.Instance.IsShowSourceColumn;
|
||||
IsShowThreadColumn = Settings.Instance.IsShowThreadColumn;
|
||||
IsShowTaskbarProgress = Settings.Instance.IsShowTaskbarProgress;
|
||||
ShowMessageHighlightByReceiverColor = Settings.Instance.ShowMessageHighlightByReceiverColor;
|
||||
IsSeparateIPLoggersByPort = Settings.Instance.IsSeparateIPLoggersByPort;
|
||||
IsAutoSave = Settings.Instance.IsAutoSave;
|
||||
AutoSaveLocation = Settings.Instance.AutoSaveLocation;
|
||||
IsErrorLogger = Settings.Instance.IsErrorLogger;
|
||||
|
||||
var themeColor = Settings.ColorThemes.FirstOrDefault(x => x.Name == Settings.Instance.CurrentColorTheme.Name);
|
||||
if(themeColor != null)
|
||||
{
|
||||
SelectedColorTheme = themeColor;
|
||||
}
|
||||
|
||||
if(IsAutoSave)
|
||||
{
|
||||
StartPersistingLogMessages();
|
||||
}
|
||||
|
||||
SelectedTheme = Settings.Instance.CurrentTheme;
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
logger.Warn(e, "SettingsViewModel: An error occurred while get receivers settings.");
|
||||
}
|
||||
}
|
||||
|
||||
#region Commands
|
||||
|
||||
private RelayCommand browseLocationCommand;
|
||||
public RelayCommand BrowseLocationCommand => browseLocationCommand ?? (browseLocationCommand = new RelayCommand(BrowseLocation));
|
||||
|
||||
private RelayCommand addReceiverCommand;
|
||||
public RelayCommand AddReceiverCommand => addReceiverCommand ?? (addReceiverCommand = new RelayCommand(AddReceiver));
|
||||
|
||||
private RelayCommand removeReceiverCommand;
|
||||
public RelayCommand RemoveReceiverCommand => removeReceiverCommand ?? (removeReceiverCommand = new RelayCommand(RemoveReceiver));
|
||||
|
||||
private RelayCommand removeIgnoreIPCommand;
|
||||
public RelayCommand RemoveIgnoreIPCommand => removeIgnoreIPCommand ?? (removeIgnoreIPCommand = new RelayCommand(RemoveIgnoreIP));
|
||||
|
||||
private RelayCommand addIgnoreIPCommand;
|
||||
public RelayCommand AddIgnoreIPCommand => addIgnoreIPCommand ?? (addIgnoreIPCommand = new RelayCommand(AddIgnoreIP));
|
||||
|
||||
private RelayCommand saveCommand;
|
||||
public RelayCommand SaveCommand => saveCommand ?? (saveCommand = new RelayCommand(Save));
|
||||
|
||||
private RelayCommand сancelCommand;
|
||||
public RelayCommand CancelCommand => сancelCommand ?? (сancelCommand = new RelayCommand(Cancel));
|
||||
|
||||
private RelayCommand showReleaseNotesCommand;
|
||||
public RelayCommand ShowReleaseNotesCommand => showReleaseNotesCommand ?? (showReleaseNotesCommand = new RelayCommand(ShowReleaseNotes));
|
||||
|
||||
#endregion
|
||||
|
||||
private void BrowseLocation()
|
||||
{
|
||||
string loc = SelectErrorLoggerLocation();
|
||||
|
||||
if(string.IsNullOrEmpty(loc))
|
||||
{
|
||||
if(receivers.Any(r => r.ReceiverType == ReceiverType.ErrorLogger && r.ErrorLoggerType == ErrorLoggerType.BIT_64))
|
||||
{
|
||||
loc = ErrorLogger64DefaultLocation;
|
||||
}
|
||||
else
|
||||
{
|
||||
loc = ErrorLogger32DefaultLocation;
|
||||
}
|
||||
}
|
||||
|
||||
AutoSaveLocation = loc;
|
||||
}
|
||||
|
||||
private string SelectErrorLoggerLocation()
|
||||
{
|
||||
using(CommonOpenFileDialog folderDialog = new CommonOpenFileDialog())
|
||||
{
|
||||
folderDialog.IsFolderPicker = true;
|
||||
folderDialog.Title = "Select folder for Logging or Navigate to the ErrorLogger.ini file";
|
||||
|
||||
if(folderDialog.ShowDialog() == CommonFileDialogResult.Ok)
|
||||
{
|
||||
return folderDialog.FileName;
|
||||
}
|
||||
else
|
||||
{
|
||||
// User canceled the dialog
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void AddReceiver()
|
||||
{
|
||||
receivers.Add(new Receiver("UDP", "", ReceiverType.UDP, receivers.Select(r => r.Name)));
|
||||
RaisePropertyChanged(() => Receivers);
|
||||
}
|
||||
|
||||
private void RemoveReceiver()
|
||||
{
|
||||
if(!receivers.Any())
|
||||
{
|
||||
IsConfigurationVisible = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
receivers.Remove(SelectedReceiver);
|
||||
}
|
||||
RaisePropertyChanged(() => Receivers);
|
||||
}
|
||||
|
||||
private void AddIgnoreIP()
|
||||
{
|
||||
if(IgnoredIPAddresses.All(x => !x.IP.Contains(TypedIP)))
|
||||
{
|
||||
IgnoredIPAddresses.Add(new IgnoredIPAddr { IP = TypedIP });
|
||||
}
|
||||
}
|
||||
|
||||
private void RemoveIgnoreIP()
|
||||
{
|
||||
IgnoredIPAddresses.Remove(SelectedIP);
|
||||
}
|
||||
|
||||
private void Save()
|
||||
{
|
||||
if(receivers.Where(r => r.ReceiverType == ReceiverType.UDP).DistinctBy(x => x.Port).Count() !=
|
||||
receivers.Count(r => r.ReceiverType == ReceiverType.UDP))
|
||||
{
|
||||
Messenger.Default.Send("Please Select Unique Port Numbers for UDP Receivers", "DisplayCustomMessage");
|
||||
return;
|
||||
}
|
||||
|
||||
Settings.Instance.MinimizeToTray = MinimizeToTray;
|
||||
Settings.Instance.AutoStartInStartup = IsAutoStartReadAtStartup;
|
||||
Settings.Instance.IsShowSourceColumn = IsShowSourceColumn;
|
||||
Settings.Instance.IsShowThreadColumn = IsShowThreadColumn;
|
||||
Settings.Instance.IsShowTaskbarProgress = IsShowTaskbarProgress;
|
||||
Settings.Instance.ShowMessageHighlightByReceiverColor = ShowMessageHighlightByReceiverColor;
|
||||
Settings.Instance.CurrentColorTheme = SelectedColorTheme;
|
||||
Settings.Instance.DataFormat = SelectedDataFormat;
|
||||
Settings.Instance.IgnoredIPs = IgnoredIPAddresses.ToList();
|
||||
Settings.Instance.Receivers = receivers.ToList();
|
||||
Settings.Instance.FontColor = SelectedColorTheme.Color.ToARGB();
|
||||
Settings.Instance.IsEnabledMaxMessageBufferSize = IsEnableMaxMessageBufferSize;
|
||||
Settings.Instance.MaxMessageBufferSize = MaxMessageBufferSize;
|
||||
Settings.Instance.DeletedMessagesCount = DeletedMessagesCount;
|
||||
Settings.Instance.OnlyOneAppInstance = OnlyOneAppInstance;
|
||||
Settings.Instance.IsSeparateIPLoggersByPort = IsSeparateIPLoggersByPort;
|
||||
Settings.Instance.IsAutoSave = IsAutoSave;
|
||||
Settings.Instance.AutoSaveLocation = AutoSaveLocation;
|
||||
Settings.Instance.IsErrorLogger = IsErrorLogger;
|
||||
|
||||
if(!string.IsNullOrEmpty(currentThemeName) && SelectedColorTheme.Name != currentThemeName)
|
||||
{
|
||||
Settings.Instance.ApplyTheme();
|
||||
}
|
||||
Settings.Instance.CurrentTheme = SelectedTheme;
|
||||
|
||||
Settings.Instance.Save();
|
||||
|
||||
Messenger.Default.Send(true, "SaveSettings");
|
||||
|
||||
if(IsAutoSave)
|
||||
{
|
||||
StopMonitoringErrorLogger();
|
||||
StopPersistingLogMessages();
|
||||
Thread.Sleep(200);
|
||||
StartPersistingLogMessages();
|
||||
}
|
||||
else
|
||||
{
|
||||
StopMonitoringErrorLogger();
|
||||
StopPersistingLogMessages();
|
||||
}
|
||||
}
|
||||
|
||||
private void Cancel()
|
||||
{
|
||||
Messenger.Default.Send(false, "SaveSettings");
|
||||
}
|
||||
|
||||
private void ShowReleaseNotes()
|
||||
{
|
||||
ReleaseNotesDialog releaseNotesDialog = new ReleaseNotesDialog
|
||||
{
|
||||
DataContext = new ReleaseNotesViewModel()
|
||||
};
|
||||
releaseNotesDialog.ShowDialog();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// identifies the log file location first and then starts writing messages to that file
|
||||
/// </summary>
|
||||
private void StartPersistingLogMessages()
|
||||
{
|
||||
if(!IsAutoSave)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
string baseFileName = string.Empty;
|
||||
|
||||
// if error logger was selected by the user use the location from the ini file
|
||||
if(IsErrorLogger)
|
||||
{
|
||||
string errorLoggerLocation = LogDashViewModelLocator.LogDashboard.GetErrorLoggerLocation();
|
||||
|
||||
FileInfo fileInfo = new FileInfo(errorLoggerLocation);
|
||||
|
||||
// special case for error logger.
|
||||
if(fileInfo.Exists)
|
||||
{
|
||||
IConfigurationFile configurationFile = new ConfigurationFile(errorLoggerLocation);
|
||||
string location = configurationFile.ReadValue("ErrorLogger", "LogPath", "");
|
||||
if(!string.IsNullOrEmpty(location))
|
||||
{
|
||||
baseFileName = location;
|
||||
|
||||
StopMonitoringErrorLogger();
|
||||
|
||||
string directory = Path.GetDirectoryName(errorLoggerLocation);
|
||||
string fileName = Path.GetFileName(errorLoggerLocation);
|
||||
|
||||
_errorLoggerWatcher = new FileSystemWatcher
|
||||
{
|
||||
Path = directory,
|
||||
Filter = fileName,
|
||||
NotifyFilter = NotifyFilters.LastWrite
|
||||
};
|
||||
_errorLoggerWatcher.Changed += ErrorLoggerChanged;
|
||||
_errorLoggerWatcher.EnableRaisingEvents = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if(string.IsNullOrEmpty(AutoSaveLocation))
|
||||
{
|
||||
AutoSaveLocation = PopulateDefaultAutoSaveLocation();
|
||||
}
|
||||
|
||||
string autoSaveLocation = ReplaceDatePatterns(AutoSaveLocation);
|
||||
|
||||
// get the file attributes for file or directory
|
||||
DirectoryInfo directoryInfo = new DirectoryInfo(autoSaveLocation);
|
||||
if(directoryInfo.IsDirectory())
|
||||
{
|
||||
if(!Directory.Exists(autoSaveLocation))
|
||||
{
|
||||
// The directory does not exist, so create it
|
||||
Directory.CreateDirectory(autoSaveLocation);
|
||||
}
|
||||
baseFileName = Path.Combine(autoSaveLocation, "LogDashboard.log");
|
||||
}
|
||||
}
|
||||
|
||||
StartPersistingLogMessagesNow(baseFileName);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// starts a thread for writing log messages to the designated location
|
||||
/// </summary>
|
||||
/// <param name="baseFileName"></param>
|
||||
private void StartPersistingLogMessagesNow(string baseFileName)
|
||||
{
|
||||
if(string.IsNullOrEmpty(baseFileName))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
StopPersistingLogMessages();
|
||||
_ctsPersistingLogMessages = new CancellationTokenSource();
|
||||
Task.Run(() => MonitorPersistingLogQueue(_persistingLogQueue, _ctsPersistingLogMessages.Token, baseFileName, Settings.Instance.AutoSaveMaxSize));
|
||||
}
|
||||
|
||||
private void ErrorLoggerChanged(object sender, FileSystemEventArgs e)
|
||||
{
|
||||
IConfigurationFile configurationFile = new ConfigurationFile(e.FullPath);
|
||||
string location = configurationFile.ReadValue("ErrorLogger", "LogPath", "");
|
||||
if(!string.IsNullOrEmpty(location))
|
||||
{
|
||||
StartPersistingLogMessagesNow(location);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// if error logger was selected for monitoring changes for the file location
|
||||
/// stops monitoring the file.
|
||||
/// </summary>
|
||||
public void StopMonitoringErrorLogger()
|
||||
{
|
||||
if(_errorLoggerWatcher == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
_errorLoggerWatcher.EnableRaisingEvents = false;
|
||||
_errorLoggerWatcher.Dispose();
|
||||
_errorLoggerWatcher = null;
|
||||
}
|
||||
|
||||
private string PopulateDefaultAutoSaveLocation()
|
||||
{
|
||||
string configPath = LocatorInstance.ErrorLogger32DefaultLocation;
|
||||
if(File.Exists(configPath))
|
||||
{
|
||||
IConfigurationFile config = new ConfigurationFile(configPath);
|
||||
if(config.ValueExists("ErrorLogger", "LogPath"))
|
||||
{
|
||||
return config.ReadValue("ErrorLogger", "LogPath", "");
|
||||
}
|
||||
}
|
||||
string configPath64 = LocatorInstance.ErrorLogger64DefaultLocation;
|
||||
if(File.Exists(configPath64))
|
||||
{
|
||||
IConfigurationFile config = new ConfigurationFile(configPath);
|
||||
if(config.ValueExists("ErrorLogger64", "LogPath"))
|
||||
{
|
||||
return config.ReadValue("ErrorLogger64", "LogPath", "");
|
||||
}
|
||||
}
|
||||
return Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "LogDashboard");
|
||||
}
|
||||
|
||||
public static string ReplaceDatePatterns(string input)
|
||||
{
|
||||
// Define the regex pattern for yyyy-mm-dd or yyyy-mm
|
||||
string pattern = @"(yyyy)-((mm)|(MM))(-dd)?";
|
||||
|
||||
// Replace the matched patterns with actual date components
|
||||
string result = Regex.Replace(input, pattern, match =>
|
||||
{
|
||||
bool year = match.Groups[1].Success;
|
||||
bool month = match.Groups[3].Success || match.Groups[4].Success;
|
||||
bool day = match.Groups[5].Success;
|
||||
|
||||
return year ? DateTime.Now.ToString($"yyyy{(month ? "-MM" : "")}{(day ? "-dd" : "")}") : "";
|
||||
});
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// generates unique file name
|
||||
/// </summary>
|
||||
/// <param name="existingFilePath"></param>
|
||||
/// <returns></returns>
|
||||
private static string GenerateUniqueFileNameDyDateTime(string existingFilePath)
|
||||
{
|
||||
string directory = Path.GetDirectoryName(existingFilePath);
|
||||
string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(existingFilePath);
|
||||
string extension = Path.GetExtension(existingFilePath);
|
||||
|
||||
// Append a timestamp to the original filename
|
||||
string uniqueFileName = $"{fileNameWithoutExtension}_{DateTime.Now:MMddHHmmss}{extension}";
|
||||
|
||||
// Combine with the directory path
|
||||
return Path.Combine(directory, uniqueFileName);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Stops recording messages into a rolling file
|
||||
/// </summary>
|
||||
public void StopPersistingLogMessages()
|
||||
{
|
||||
_ctsPersistingLogMessages?.Cancel();
|
||||
Thread.Sleep(400);
|
||||
_ctsPersistingLogMessages?.Dispose();
|
||||
_ctsPersistingLogMessages = null;
|
||||
ClearQueue(_persistingLogQueue);
|
||||
}
|
||||
|
||||
private void PersistLogMessage(LogMessage logMessage)
|
||||
{
|
||||
_persistingLogQueue.Enqueue(logMessage);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// open log file and write LogMessage to it, until reaches the max size limit
|
||||
/// then it rolls over to the next file
|
||||
/// </summary>
|
||||
/// <param name="queue"></param>
|
||||
/// <param name="cancellationToken"></param>
|
||||
/// <param name="fileName"></param>
|
||||
private static void MonitorPersistingLogQueue(ConcurrentQueue<LogMessage> queue, CancellationToken cancellationToken, string baseFileName, long maxFileSize)
|
||||
{
|
||||
FileStream fileStream = null;
|
||||
StreamWriter writer = null;
|
||||
bool rollOver = false;
|
||||
|
||||
try
|
||||
{
|
||||
while(!cancellationToken.IsCancellationRequested)
|
||||
{
|
||||
// Open the base file for writing
|
||||
fileStream = new FileStream(baseFileName, FileMode.OpenOrCreate, FileAccess.Write);
|
||||
writer = new StreamWriter(fileStream)
|
||||
{
|
||||
AutoFlush = true
|
||||
};
|
||||
|
||||
// Move the stream position to the end of the file
|
||||
fileStream.Seek(0, SeekOrigin.End);
|
||||
|
||||
while(fileStream.Length < maxFileSize && !cancellationToken.IsCancellationRequested)
|
||||
{
|
||||
if(queue.TryDequeue(out var logMessage))
|
||||
{
|
||||
string message = $"{logMessage.Time:MM-dd-yy HH:mm:ss.ffff};{logMessage.Level};{logMessage.ProcessID ?? 0};{logMessage.Thread};{logMessage.Logger};{logMessage.Address};{logMessage.Message}";
|
||||
writer.WriteLine(message);
|
||||
}
|
||||
else
|
||||
{
|
||||
// No message in the queue, wait for a short time
|
||||
Thread.Sleep(100);
|
||||
}
|
||||
}
|
||||
|
||||
if(fileStream.Length >= maxFileSize)
|
||||
{
|
||||
rollOver = true;
|
||||
}
|
||||
|
||||
writer?.Close();
|
||||
fileStream?.Close();
|
||||
|
||||
if(rollOver)
|
||||
{
|
||||
rollOver = false;
|
||||
// Generate a unique file name for the current log file
|
||||
string uniqueFileName = GenerateUniqueFileNameDyDateTime(baseFileName);
|
||||
File.Move(baseFileName, uniqueFileName); // Save a copy of the file
|
||||
|
||||
// Delete the old base file
|
||||
File.Delete(baseFileName);
|
||||
}
|
||||
Thread.Sleep(100);
|
||||
}
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
Messenger.Default.Send($"An error occurred while trying to log messages to {baseFileName}.\n{ex.Message}", "DisplayCustomMessage");
|
||||
}
|
||||
finally
|
||||
{
|
||||
writer?.Close();
|
||||
fileStream?.Close();
|
||||
}
|
||||
}
|
||||
|
||||
private static void ClearQueue<T>(ConcurrentQueue<T> queue)
|
||||
{
|
||||
while(!queue.IsEmpty)
|
||||
{
|
||||
queue.TryDequeue(out _);
|
||||
}
|
||||
}
|
||||
|
||||
private void ParseTheme()
|
||||
{
|
||||
try
|
||||
{
|
||||
string source = Application.Current.Resources.MergedDictionaries[2].Source.ToString().Replace(".xaml", string.Empty);
|
||||
string themeName = source.Substring(source.LastIndexOf(".") + 1);
|
||||
currentThemeName = themeName;
|
||||
var theme = Settings.ColorThemes.FirstOrDefault(x => x.Name == themeName);
|
||||
if(theme != null)
|
||||
{
|
||||
SelectedColorTheme = theme;
|
||||
}
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
logger.Warn(e, "An error occurred while ParseTheme");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
//******************************************************************************//
|
||||
// SidebarTreeViewModel.cs
|
||||
// 12/4/2023
|
||||
//
|
||||
// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
||||
// PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
||||
// AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
||||
// UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
||||
// RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
||||
// CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
||||
// OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
||||
// COMPANY.
|
||||
//
|
||||
// THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT
|
||||
//
|
||||
// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
||||
//
|
||||
// WARNING: THIS DOCUMENT CONTAINS TECHNICAL DATA AND / OR TECHNOLOGY WHOSE
|
||||
// EXPORT OR DISCLOSURE TO NON-U.S. PERSONS, WHEREVER LOCATED, IS RESTRICTED
|
||||
// BY THE INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) (22 C.F.R. SECTION
|
||||
// 120-130) OR THE EXPORT ADMINISTRATION REGULATIONS (EAR) (15 C.F.R. SECTION
|
||||
// 730-774). THIS DOCUMENT CANNOT BE EXPORTED (E.G., PROVIDED TO A SUPPLIER
|
||||
// OUTSIDE OF THE UNITED STATES) OR DISCLOSED TO A NON-U.S. PERSON, WHEREVER
|
||||
// LOCATED, UNTIL A FINAL JURISDICTION AND CLASSIFICATION DETERMINATION HAS
|
||||
// BEEN COMPLETED AND APPROVED BY RAYTHEON, AND ANY REQUIRED U.S. GOVERNMENT
|
||||
// APPROVALS HAVE BEEN OBTAINED. VIOLATIONS ARE SUBJECT TO SEVERE CRIMINAL
|
||||
// PENALTIES.
|
||||
//
|
||||
// DOD 5220.22-M, INDUSTRIAL SECURITY MANUAL, CHAPTER 5, SECTION 1 THROUGH 9 :
|
||||
// FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN OR DOD 5200.1-R,
|
||||
// INFORMATION SECURITY PROGRAM, CHAPTER 6. FOR UNCLASSIFIED, LIMITED DOCUMENTS
|
||||
// DESTROY BY ANY METHOD THAT WILL PREVENT DISCLOSURE OF CONTENTS OR
|
||||
// RECONSTRUCTION OF THE DOCUMENT.
|
||||
// POC: Alex Kravchenko (1118268)
|
||||
//******************************************************************************//
|
||||
using GalaSoft.MvvmLight;
|
||||
|
||||
namespace Raytheon.LogDashboard.ViewModel
|
||||
{
|
||||
public class SidebarTreeViewModel : ViewModelBase
|
||||
{
|
||||
}
|
||||
}
|
||||
Loaded 100 of 118 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user