1
0
mirror of synced 2024-11-23 13:03:50 +00:00

Implemented Import functionality for Tapeti.Cmd compatible single-file JSON

This commit is contained in:
Mark van Renswoude 2022-01-11 20:28:49 +01:00
parent 2505dad190
commit 89fa2fccee
39 changed files with 1757 additions and 163 deletions

View File

@ -1,4 +1,5 @@
using System; using System;
using System.Collections.Generic;
namespace PettingZoo.Core.Connection namespace PettingZoo.Core.Connection
{ {
@ -10,6 +11,7 @@ namespace PettingZoo.Core.Connection
event EventHandler<MessageReceivedEventArgs>? MessageReceived; event EventHandler<MessageReceivedEventArgs>? MessageReceived;
IEnumerable<ReceivedMessageInfo> GetInitialMessages();
void Start(); void Start();
} }

View File

@ -1,16 +0,0 @@
using System.Collections.Generic;
namespace PettingZoo.Core.Export
{
public class ExportFormatProvider : IExportFormatProvider
{
private readonly List<IExportFormat> formats;
public IEnumerable<IExportFormat> Formats => formats;
public ExportFormatProvider(params IExportFormat[] formats)
{
this.formats = new List<IExportFormat>(formats);
}
}
}

View File

@ -1,14 +0,0 @@
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
using PettingZoo.Core.Connection;
namespace PettingZoo.Core.Export
{
public interface IExportFormat
{
public string Filter { get; }
public Task Export(Stream stream, IEnumerable<ReceivedMessageInfo> messages);
}
}

View File

@ -1,9 +0,0 @@
using System.Collections.Generic;
namespace PettingZoo.Core.Export
{
public interface IExportFormatProvider
{
public IEnumerable<IExportFormat> Formats { get; }
}
}

View File

@ -0,0 +1,33 @@
using System;
namespace PettingZoo.Core.ExportImport
{
public abstract class BaseProgressDecorator
{
private static readonly TimeSpan DefaultReportInterval = TimeSpan.FromMilliseconds(100);
private readonly IProgress<int> progress;
private readonly long reportInterval;
private long lastReport;
protected BaseProgressDecorator(IProgress<int> progress, TimeSpan? reportInterval = null)
{
this.progress = progress;
this.reportInterval = (int)(reportInterval ?? DefaultReportInterval).TotalMilliseconds;
}
protected abstract int GetProgress();
protected void UpdateProgress()
{
// Because this method is called pretty frequently, not having DateTime's small overhead is worth it
var now = Environment.TickCount64;
if (now - lastReport < reportInterval)
return;
progress.Report(GetProgress());
lastReport = now;
}
}
}

View File

@ -0,0 +1,22 @@
using System.Collections.Generic;
using System.Linq;
namespace PettingZoo.Core.ExportImport
{
public class ExportImportFormatProvider : IExportImportFormatProvider
{
private readonly List<IExportFormat> exportFormats;
private readonly List<IImportFormat> importFormats;
public IEnumerable<IExportFormat> ExportFormats => exportFormats;
public IEnumerable<IImportFormat> ImportFormats => importFormats;
public ExportImportFormatProvider(params IExportImportFormat[] formats)
{
exportFormats = new List<IExportFormat>(formats.Where(f => f is IExportFormat).Cast<IExportFormat>());
importFormats = new List<IImportFormat>(formats.Where(f => f is IImportFormat).Cast<IImportFormat>());
}
}
}

View File

@ -0,0 +1,25 @@
using System.Collections.Generic;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
using PettingZoo.Core.Connection;
namespace PettingZoo.Core.ExportImport
{
public interface IExportImportFormat
{
string Filter { get; }
}
public interface IExportFormat : IExportImportFormat
{
Task Export(Stream stream, IEnumerable<ReceivedMessageInfo> messages, CancellationToken cancellationToken);
}
public interface IImportFormat : IExportImportFormat
{
Task<IReadOnlyList<ReceivedMessageInfo>> Import(Stream stream, CancellationToken cancellationToken);
}
}

View File

@ -0,0 +1,10 @@
using System.Collections.Generic;
namespace PettingZoo.Core.ExportImport
{
public interface IExportImportFormatProvider
{
public IEnumerable<IExportFormat> ExportFormats { get; }
public IEnumerable<IImportFormat> ImportFormats { get; }
}
}

View File

@ -0,0 +1,43 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
using PettingZoo.Core.Connection;
namespace PettingZoo.Core.ExportImport
{
public class ImportSubscriber : ISubscriber
{
private readonly IReadOnlyList<ReceivedMessageInfo> messages;
public string? QueueName { get; }
public string? Exchange => null;
public string? RoutingKey => null;
public event EventHandler<MessageReceivedEventArgs>? MessageReceived;
public ImportSubscriber(string filename, IReadOnlyList<ReceivedMessageInfo> messages)
{
QueueName = Path.GetFileName(filename);
this.messages = messages;
}
public ValueTask DisposeAsync()
{
GC.SuppressFinalize(this);
return default;
}
public IEnumerable<ReceivedMessageInfo> GetInitialMessages()
{
return messages;
}
public void Start()
{
}
}
}

View File

@ -0,0 +1,100 @@
using System;
using System.Collections;
using System.Collections.Generic;
namespace PettingZoo.Core.ExportImport
{
public class ListEnumerableProgressDecorator<T> : BaseProgressDecorator, IEnumerable<T>
{
private readonly IReadOnlyList<T> decoratedList;
private int position;
/// <summary>
/// Wraps an IReadOnlyList and provides reports to the IProgress when it is enumerated.
/// </summary>
/// <param name="decoratedList">The IReadOnlyList to decorate.</param>
/// <param name="progress">Receives progress reports. The value will be a percentage (0 - 100).</param>
/// <param name="reportInterval">The minimum time between reports.</param>
public ListEnumerableProgressDecorator(IReadOnlyList<T> decoratedList, IProgress<int> progress, TimeSpan? reportInterval = null)
: base(progress, reportInterval)
{
this.decoratedList = decoratedList;
}
protected override int GetProgress()
{
return decoratedList.Count > 0
? (int)Math.Truncate((double)position / decoratedList.Count * 100)
: 0;
}
protected void AfterNext()
{
position++;
UpdateProgress();
}
protected void Reset()
{
position = 0;
UpdateProgress();
}
public IEnumerator<T> GetEnumerator()
{
return new EnumerableWrapper(this, decoratedList.GetEnumerator());
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
private class EnumerableWrapper : IEnumerator<T>
{
private readonly ListEnumerableProgressDecorator<T> owner;
private readonly IEnumerator<T> decoratedEnumerator;
public EnumerableWrapper(ListEnumerableProgressDecorator<T> owner, IEnumerator<T> decoratedEnumerator)
{
this.owner = owner;
this.decoratedEnumerator = decoratedEnumerator;
}
public bool MoveNext()
{
var result = decoratedEnumerator.MoveNext();
if (result)
owner.AfterNext();
return result;
}
public void Reset()
{
decoratedEnumerator.Reset();
owner.Reset();
}
public T Current => decoratedEnumerator.Current;
object IEnumerator.Current => decoratedEnumerator.Current!;
public void Dispose()
{
GC.SuppressFinalize(this);
decoratedEnumerator.Dispose();
}
}
}
}

View File

@ -0,0 +1,157 @@
using System;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
namespace PettingZoo.Core.ExportImport
{
public class StreamProgressDecorator : BaseProgressDecorator
{
private readonly StreamWrapper streamWrapper;
public Stream Stream => streamWrapper;
/// <summary>
/// Wraps a Stream and provides reports to the IProgress.
/// </summary>
/// <remarks>
/// Use the Stream property to pass along to the method you want to monitor the progress on.
/// If the consumer seeks around in the stream a lot the progress will not be linear, but that
/// seems to be a trend anyways with progress bars, so enjoy your modern experience!
/// </remarks>
/// <param name="decoratedStream">The stream to decorate.</param>
/// <param name="progress">Receives progress reports. The value will be a percentage (0 - 100).</param>
/// <param name="reportInterval">The minimum time between reports.</param>
public StreamProgressDecorator(Stream decoratedStream, IProgress<int> progress, TimeSpan? reportInterval = null)
: base(progress, reportInterval)
{
streamWrapper = new StreamWrapper(this, decoratedStream);
}
protected override int GetProgress()
{
return streamWrapper.DecoratedStream.Length > 0
? (int)Math.Truncate((double)streamWrapper.DecoratedStream.Position / streamWrapper.DecoratedStream.Length * 100)
: 0;
}
private class StreamWrapper : Stream
{
private readonly StreamProgressDecorator owner;
public readonly Stream DecoratedStream;
public override bool CanRead => DecoratedStream.CanRead;
public override bool CanSeek => DecoratedStream.CanSeek;
public override bool CanWrite => DecoratedStream.CanWrite;
public override long Length => DecoratedStream.Length;
public override long Position
{
get => DecoratedStream.Position;
set => DecoratedStream.Position = value;
}
public StreamWrapper(StreamProgressDecorator owner, Stream decoratedStream)
{
this.owner = owner;
this.DecoratedStream = decoratedStream;
}
public override void Flush()
{
DecoratedStream.Flush();
}
public override Task FlushAsync(CancellationToken cancellationToken)
{
return DecoratedStream.FlushAsync(cancellationToken);
}
public override int Read(byte[] buffer, int offset, int count)
{
var result = DecoratedStream.Read(buffer, offset, count);
owner.UpdateProgress();
return result;
}
public override int Read(Span<byte> buffer)
{
var result = DecoratedStream.Read(buffer);
owner.UpdateProgress();
return result;
}
public override async Task<int> ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken)
{
#pragma warning disable CA1835 // Prefer the 'Memory'-based overloads for 'ReadAsync' and 'WriteAsync'
var result = await DecoratedStream.ReadAsync(buffer, offset, count, cancellationToken);
#pragma warning restore CA1835
owner.UpdateProgress();
return result;
}
public override ValueTask<int> ReadAsync(Memory<byte> buffer, CancellationToken cancellationToken = new())
{
var result = DecoratedStream.ReadAsync(buffer, cancellationToken);
owner.UpdateProgress();
return result;
}
public override long Seek(long offset, SeekOrigin origin)
{
var result = DecoratedStream.Seek(offset, origin);
owner.UpdateProgress();
return result;
}
public override void SetLength(long value)
{
DecoratedStream.SetLength(value);
owner.UpdateProgress();
}
public override void Write(byte[] buffer, int offset, int count)
{
DecoratedStream.Write(buffer, offset, count);
owner.UpdateProgress();
}
public override void Write(ReadOnlySpan<byte> buffer)
{
DecoratedStream.Write(buffer);
owner.UpdateProgress();
}
public override async Task WriteAsync(byte[] buffer, int offset, int count,
CancellationToken cancellationToken)
{
#pragma warning disable CA1835 // Prefer the 'Memory'-based overloads for 'ReadAsync' and 'WriteAsync'
await DecoratedStream.WriteAsync(buffer, offset, count, cancellationToken);
#pragma warning restore CA1835
owner.UpdateProgress();
}
public override async ValueTask WriteAsync(ReadOnlyMemory<byte> buffer,
CancellationToken cancellationToken = new())
{
await DecoratedStream.WriteAsync(buffer, cancellationToken);
owner.UpdateProgress();
}
}
}
}

View File

@ -1,4 +1,6 @@
using System; using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using PettingZoo.Core.Connection; using PettingZoo.Core.Connection;
using RabbitMQ.Client; using RabbitMQ.Client;
@ -38,6 +40,12 @@ namespace PettingZoo.RabbitMQ
} }
public IEnumerable<ReceivedMessageInfo> GetInitialMessages()
{
return Enumerable.Empty<ReceivedMessageInfo>();
}
public void Start() public void Start()
{ {
started = true; started = true;

View File

@ -0,0 +1,47 @@
using System.Collections.Generic;
using Newtonsoft.Json.Linq;
using PettingZoo.Core.ExportImport;
namespace PettingZoo.Tapeti.Export
{
public abstract class BaseTapetiCmdExportImportFormat : IExportImportFormat
{
public string Filter => TapetiCmdImportExportStrings.TapetiCmdFilter;
}
// It would be nicer if Tapeti.Cmd exposed it's file format in a NuGet package... if only I knew the author ¯\_(ツ)_/¯
public class SerializableMessage
{
//public ulong DeliveryTag;
//public bool Redelivered;
public string? Exchange;
public string? RoutingKey;
//public string? Queue;
// ReSharper disable once FieldCanBeMadeReadOnly.Local - must be settable by JSON deserialization
public SerializableMessageProperties? Properties;
public JObject? Body;
public byte[]? RawBody;
}
public class SerializableMessageProperties
{
public string? AppId;
//public string? ClusterId;
public string? ContentEncoding;
public string? ContentType;
public string? CorrelationId;
public byte? DeliveryMode;
public string? Expiration;
public IDictionary<string, string>? Headers;
public string? MessageId;
public byte? Priority;
public string? ReplyTo;
public long? Timestamp;
public string? Type;
public string? UserId;
}
}

View File

@ -3,31 +3,33 @@ using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Newtonsoft.Json; using Newtonsoft.Json;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
using PettingZoo.Core.Connection; using PettingZoo.Core.Connection;
using PettingZoo.Core.Export; using PettingZoo.Core.ExportImport;
namespace PettingZoo.Tapeti.Export namespace PettingZoo.Tapeti.Export
{ {
public class TapetiCmdExportFormat : IExportFormat public class TapetiCmdExportFormat : BaseTapetiCmdExportImportFormat, IExportFormat
{ {
public string Filter => TapetiCmdExportStrings.TapetiCmdFilter;
private static readonly JsonSerializerSettings SerializerSettings = new() private static readonly JsonSerializerSettings SerializerSettings = new()
{ {
NullValueHandling = NullValueHandling.Ignore NullValueHandling = NullValueHandling.Ignore
}; };
public async Task Export(Stream stream, IEnumerable<ReceivedMessageInfo> messages) public async Task Export(Stream stream, IEnumerable<ReceivedMessageInfo> messages, CancellationToken cancellationToken)
{ {
await using var exportFile = new StreamWriter(stream, Encoding.UTF8); await using var exportFile = new StreamWriter(stream, Encoding.UTF8);
foreach (var message in messages) foreach (var message in messages)
{ {
if (cancellationToken.IsCancellationRequested)
break;
var serializableMessage = new SerializableMessage var serializableMessage = new SerializableMessage
{ {
Exchange = message.Exchange, Exchange = message.Exchange,
@ -80,40 +82,4 @@ namespace PettingZoo.Tapeti.Export
} }
} }
} }
// It would be nicer if Tapeti.Cmd exposed it's file format in a NuGet package... if only I knew the author ¯\_(ツ)_/¯
public class SerializableMessage
{
//public ulong DeliveryTag;
//public bool Redelivered;
public string? Exchange;
public string? RoutingKey;
//public string? Queue;
// ReSharper disable once FieldCanBeMadeReadOnly.Local - must be settable by JSON deserialization
public SerializableMessageProperties? Properties;
public JObject? Body;
public byte[]? RawBody;
}
public class SerializableMessageProperties
{
public string? AppId;
//public string? ClusterId;
public string? ContentEncoding;
public string? ContentType;
public string? CorrelationId;
public byte? DeliveryMode;
public string? Expiration;
public IDictionary<string, string>? Headers;
public string? MessageId;
public byte? Priority;
public string? ReplyTo;
public long? Timestamp;
public string? Type;
public string? UserId;
}
} }

View File

@ -22,14 +22,14 @@ namespace PettingZoo.Tapeti.Export {
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class TapetiCmdExportStrings { internal class TapetiCmdImportExportStrings {
private static global::System.Resources.ResourceManager resourceMan; private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture; private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal TapetiCmdExportStrings() { internal TapetiCmdImportExportStrings() {
} }
/// <summary> /// <summary>
@ -39,7 +39,7 @@ namespace PettingZoo.Tapeti.Export {
internal static global::System.Resources.ResourceManager ResourceManager { internal static global::System.Resources.ResourceManager ResourceManager {
get { get {
if (object.ReferenceEquals(resourceMan, null)) { if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("PettingZoo.Tapeti.Export.TapetiCmdExportStrings", typeof(TapetiCmdExportStrings).Assembly); global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("PettingZoo.Tapeti.Export.TapetiCmdImportExportStrings", typeof(TapetiCmdImportExportStrings).Assembly);
resourceMan = temp; resourceMan = temp;
} }
return resourceMan; return resourceMan;

View File

@ -0,0 +1,75 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Newtonsoft.Json;
using PettingZoo.Core.Connection;
using PettingZoo.Core.ExportImport;
namespace PettingZoo.Tapeti.Export
{
public class TapetiCmdImportFormat : BaseTapetiCmdExportImportFormat, IImportFormat
{
private const int DefaultBufferSize = 1024;
public async Task<IReadOnlyList<ReceivedMessageInfo>> Import(Stream stream, CancellationToken cancellationToken)
{
var now = DateTime.Now;
using var reader = new StreamReader(stream, Encoding.UTF8, true, DefaultBufferSize, true);
var messages = new List<ReceivedMessageInfo>();
while (!reader.EndOfStream && !cancellationToken.IsCancellationRequested)
{
var serialized = await reader.ReadLineAsync();
if (string.IsNullOrEmpty(serialized))
continue;
var serializableMessage = JsonConvert.DeserializeObject<SerializableMessage>(serialized);
if (serializableMessage == null)
continue;
var body = serializableMessage.Body != null
? Encoding.UTF8.GetBytes(serializableMessage.Body.ToString(Formatting.Indented))
: serializableMessage.RawBody;
var messageTimestamp = serializableMessage.Properties?.Timestamp != null
? DateTimeOffset.FromUnixTimeSeconds(serializableMessage.Properties.Timestamp.Value).LocalDateTime
: now;
messages.Add(new ReceivedMessageInfo(
serializableMessage.Exchange ?? "",
serializableMessage.RoutingKey ?? "",
body ?? Array.Empty<byte>(),
// IReadOnlyDictionary is not compatible with IDictionary? wow.
new MessageProperties(serializableMessage.Properties?.Headers?.ToDictionary(p => p.Key, p => p.Value))
{
AppId = serializableMessage.Properties?.AppId,
ContentEncoding = serializableMessage.Properties?.ContentEncoding,
ContentType = serializableMessage.Properties?.ContentType,
CorrelationId = serializableMessage.Properties?.CorrelationId,
DeliveryMode = serializableMessage.Properties?.DeliveryMode switch
{
2 => MessageDeliveryMode.Persistent,
_ => MessageDeliveryMode.NonPersistent
},
Expiration = serializableMessage.Properties?.Expiration,
MessageId = serializableMessage.Properties?.MessageId,
Priority = serializableMessage.Properties?.Priority,
ReplyTo = serializableMessage.Properties?.ReplyTo,
Timestamp = messageTimestamp,
Type = serializableMessage.Properties?.Type,
UserId = serializableMessage.Properties?.UserId
},
messageTimestamp));
}
return messages;
}
}
}

View File

@ -32,24 +32,21 @@
<AutoGen>True</AutoGen> <AutoGen>True</AutoGen>
<DependentUpon>AssemblyParserStrings.resx</DependentUpon> <DependentUpon>AssemblyParserStrings.resx</DependentUpon>
</Compile> </Compile>
<Compile Update="Export\TapetiCmdExportStrings.Designer.cs"> <Compile Update="Export\TapetiCmdImportExportStrings.Designer.cs">
<DesignTime>True</DesignTime> <DesignTime>True</DesignTime>
<AutoGen>True</AutoGen> <AutoGen>True</AutoGen>
<DependentUpon>TapetiCmdExportStrings.resx</DependentUpon> <DependentUpon>TapetiCmdImportExportStrings.resx</DependentUpon>
</Compile>
<Compile Update="TapetiClassLibraryExampleGeneratorStrings.Designer.cs">
<DesignTime>True</DesignTime>
<AutoGen>True</AutoGen>
<DependentUpon>TapetiClassLibraryExampleGeneratorStrings.resx</DependentUpon>
</Compile> </Compile>
<Compile Update="UI\ClassSelection\ClassSelectionStrings.Designer.cs"> <Compile Update="UI\ClassSelection\ClassSelectionStrings.Designer.cs">
<DesignTime>True</DesignTime> <DesignTime>True</DesignTime>
<AutoGen>True</AutoGen> <AutoGen>True</AutoGen>
<DependentUpon>ClassSelectionStrings.resx</DependentUpon> <DependentUpon>ClassSelectionStrings.resx</DependentUpon>
</Compile> </Compile>
<Compile Update="UI\PackageProgress\PackageProgressStrings.Designer.cs">
<DesignTime>True</DesignTime>
<AutoGen>True</AutoGen>
<DependentUpon>PackageProgressStrings.resx</DependentUpon>
</Compile>
<Compile Update="UI\PackageProgress\PackageProgressWindow.xaml.cs">
<SubType>Code</SubType>
</Compile>
<Compile Update="UI\PackageSelection\PackageSelectionStrings.Designer.cs"> <Compile Update="UI\PackageSelection\PackageSelectionStrings.Designer.cs">
<DesignTime>True</DesignTime> <DesignTime>True</DesignTime>
<AutoGen>True</AutoGen> <AutoGen>True</AutoGen>
@ -62,29 +59,22 @@
<Generator>ResXFileCodeGenerator</Generator> <Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>AssemblyParserStrings.Designer.cs</LastGenOutput> <LastGenOutput>AssemblyParserStrings.Designer.cs</LastGenOutput>
</EmbeddedResource> </EmbeddedResource>
<EmbeddedResource Update="Export\TapetiCmdExportStrings.resx"> <EmbeddedResource Update="Export\TapetiCmdImportExportStrings.resx">
<Generator>ResXFileCodeGenerator</Generator> <Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>TapetiCmdExportStrings.Designer.cs</LastGenOutput> <LastGenOutput>TapetiCmdImportExportStrings.Designer.cs</LastGenOutput>
</EmbeddedResource>
<EmbeddedResource Update="TapetiClassLibraryExampleGeneratorStrings.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>TapetiClassLibraryExampleGeneratorStrings.Designer.cs</LastGenOutput>
</EmbeddedResource> </EmbeddedResource>
<EmbeddedResource Update="UI\ClassSelection\ClassSelectionStrings.resx"> <EmbeddedResource Update="UI\ClassSelection\ClassSelectionStrings.resx">
<Generator>PublicResXFileCodeGenerator</Generator> <Generator>PublicResXFileCodeGenerator</Generator>
<LastGenOutput>ClassSelectionStrings.Designer.cs</LastGenOutput> <LastGenOutput>ClassSelectionStrings.Designer.cs</LastGenOutput>
</EmbeddedResource> </EmbeddedResource>
<EmbeddedResource Update="UI\PackageProgress\PackageProgressStrings.resx">
<Generator>PublicResXFileCodeGenerator</Generator>
<LastGenOutput>PackageProgressStrings.Designer.cs</LastGenOutput>
</EmbeddedResource>
<EmbeddedResource Update="UI\PackageSelection\PackageSelectionStrings.resx"> <EmbeddedResource Update="UI\PackageSelection\PackageSelectionStrings.resx">
<Generator>PublicResXFileCodeGenerator</Generator> <Generator>PublicResXFileCodeGenerator</Generator>
<LastGenOutput>PackageSelectionStrings.Designer.cs</LastGenOutput> <LastGenOutput>PackageSelectionStrings.Designer.cs</LastGenOutput>
</EmbeddedResource> </EmbeddedResource>
</ItemGroup> </ItemGroup>
<ItemGroup>
<Page Update="UI\PackageProgress\PackageProgressWindow.xaml">
<XamlRuntime>$(DefaultXamlRuntime)</XamlRuntime>
<SubType>Designer</SubType>
</Page>
</ItemGroup>
</Project> </Project>

View File

@ -0,0 +1,325 @@
<Project>
<PropertyGroup>
<AssemblyName>PettingZoo.Tapeti</AssemblyName>
<IntermediateOutputPath>obj\Debug\</IntermediateOutputPath>
<BaseIntermediateOutputPath>obj\</BaseIntermediateOutputPath>
<MSBuildProjectExtensionsPath>P:\Development\PettingZoo\PettingZoo.Tapeti\obj\</MSBuildProjectExtensionsPath>
<_TargetAssemblyProjectName>PettingZoo.Tapeti</_TargetAssemblyProjectName>
</PropertyGroup>
<Import Project="Sdk.props" Sdk="Microsoft.NET.Sdk" />
<PropertyGroup>
<TargetFramework>net6.0-windows</TargetFramework>
<Version>0.1</Version>
<UseWpf>true</UseWpf>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
<PackageReference Include="NuGet.PackageManagement" Version="6.0.0" />
<PackageReference Include="NuGet.Packaging" Version="6.0.0" />
<PackageReference Include="NuGet.Protocol" Version="6.0.0" />
<PackageReference Include="Serilog" Version="2.10.0" />
<PackageReference Include="SharpVectors" Version="1.7.7" />
<PackageReference Include="System.ComponentModel.Annotations" Version="5.0.0" />
<PackageReference Include="System.Reactive" Version="5.0.0" />
<PackageReference Include="System.Reflection.MetadataLoadContext" Version="6.0.0" />
<PackageReference Include="Tapeti.Annotations" Version="3.0.0" />
<PackageReference Include="Tapeti.DataAnnotations.Extensions" Version="3.0.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\PettingZoo.Core\PettingZoo.Core.csproj" />
<ProjectReference Include="..\PettingZoo.WPF\PettingZoo.WPF.csproj" />
</ItemGroup>
<ItemGroup>
<Compile Update="AssemblyParser\AssemblyParserStrings.Designer.cs">
<DesignTime>True</DesignTime>
<AutoGen>True</AutoGen>
<DependentUpon>AssemblyParserStrings.resx</DependentUpon>
</Compile>
<Compile Update="Export\TapetiCmdImportExportStrings.Designer.cs">
<DesignTime>True</DesignTime>
<AutoGen>True</AutoGen>
<DependentUpon>TapetiCmdImportExportStrings.resx</DependentUpon>
</Compile>
<Compile Update="TapetiClassLibraryExampleGeneratorStrings.Designer.cs">
<DesignTime>True</DesignTime>
<AutoGen>True</AutoGen>
<DependentUpon>TapetiClassLibraryExampleGeneratorStrings.resx</DependentUpon>
</Compile>
<Compile Update="UI\ClassSelection\ClassSelectionStrings.Designer.cs">
<DesignTime>True</DesignTime>
<AutoGen>True</AutoGen>
<DependentUpon>ClassSelectionStrings.resx</DependentUpon>
</Compile>
<Compile Update="UI\PackageSelection\PackageSelectionStrings.Designer.cs">
<DesignTime>True</DesignTime>
<AutoGen>True</AutoGen>
<DependentUpon>PackageSelectionStrings.resx</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Update="AssemblyParser\AssemblyParserStrings.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>AssemblyParserStrings.Designer.cs</LastGenOutput>
</EmbeddedResource>
<EmbeddedResource Update="Export\TapetiCmdImportExportStrings.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>TapetiCmdImportExportStrings.Designer.cs</LastGenOutput>
</EmbeddedResource>
<EmbeddedResource Update="TapetiClassLibraryExampleGeneratorStrings.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>TapetiClassLibraryExampleGeneratorStrings.Designer.cs</LastGenOutput>
</EmbeddedResource>
<EmbeddedResource Update="UI\ClassSelection\ClassSelectionStrings.resx">
<Generator>PublicResXFileCodeGenerator</Generator>
<LastGenOutput>ClassSelectionStrings.Designer.cs</LastGenOutput>
</EmbeddedResource>
<EmbeddedResource Update="UI\PackageSelection\PackageSelectionStrings.resx">
<Generator>PublicResXFileCodeGenerator</Generator>
<LastGenOutput>PackageSelectionStrings.Designer.cs</LastGenOutput>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\Accessibility.dll" />
<ReferencePath Include="C:\Users\PsychoMark\.nuget\packages\avalonedit\6.1.3.50\lib\net6.0-windows7.0\ICSharpCode.AvalonEdit.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\Microsoft.CSharp.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\Microsoft.VisualBasic.Core.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\Microsoft.VisualBasic.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\Microsoft.VisualBasic.Forms.dll" />
<ReferencePath Include="C:\Users\PsychoMark\.nuget\packages\microsoft.web.xdt\3.0.0\lib\netstandard2.0\Microsoft.Web.XmlTransform.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\Microsoft.Win32.Primitives.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\Microsoft.Win32.Registry.AccessControl.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\Microsoft.Win32.Registry.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\Microsoft.Win32.SystemEvents.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\mscorlib.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\netstandard.dll" />
<ReferencePath Include="C:\Users\PsychoMark\.nuget\packages\newtonsoft.json\13.0.1\lib\netstandard2.0\Newtonsoft.Json.dll" />
<ReferencePath Include="C:\Users\PsychoMark\.nuget\packages\nuget.commands\6.0.0\lib\net5.0\NuGet.Commands.dll" />
<ReferencePath Include="C:\Users\PsychoMark\.nuget\packages\nuget.common\6.0.0\lib\netstandard2.0\NuGet.Common.dll" />
<ReferencePath Include="C:\Users\PsychoMark\.nuget\packages\nuget.configuration\6.0.0\lib\netstandard2.0\NuGet.Configuration.dll" />
<ReferencePath Include="C:\Users\PsychoMark\.nuget\packages\nuget.credentials\6.0.0\lib\net5.0\NuGet.Credentials.dll" />
<ReferencePath Include="C:\Users\PsychoMark\.nuget\packages\nuget.dependencyresolver.core\6.0.0\lib\net5.0\NuGet.DependencyResolver.Core.dll" />
<ReferencePath Include="C:\Users\PsychoMark\.nuget\packages\nuget.frameworks\6.0.0\lib\netstandard2.0\NuGet.Frameworks.dll" />
<ReferencePath Include="C:\Users\PsychoMark\.nuget\packages\nuget.librarymodel\6.0.0\lib\netstandard2.0\NuGet.LibraryModel.dll" />
<ReferencePath Include="C:\Users\PsychoMark\.nuget\packages\nuget.packagemanagement\6.0.0\lib\netstandard2.0\NuGet.PackageManagement.dll" />
<ReferencePath Include="C:\Users\PsychoMark\.nuget\packages\nuget.packaging\6.0.0\lib\net5.0\NuGet.Packaging.dll" />
<ReferencePath Include="C:\Users\PsychoMark\.nuget\packages\nuget.projectmodel\6.0.0\lib\net5.0\NuGet.ProjectModel.dll" />
<ReferencePath Include="C:\Users\PsychoMark\.nuget\packages\nuget.protocol\6.0.0\lib\net5.0\NuGet.Protocol.dll" />
<ReferencePath Include="C:\Users\PsychoMark\.nuget\packages\nuget.resolver\6.0.0\lib\net5.0\NuGet.Resolver.dll" />
<ReferencePath Include="C:\Users\PsychoMark\.nuget\packages\nuget.versioning\6.0.0\lib\netstandard2.0\NuGet.Versioning.dll" />
<ReferencePath Include="P:\Development\PettingZoo\PettingZoo.Core\bin\Debug\net6.0\PettingZoo.Core.dll" />
<ReferencePath Include="P:\Development\PettingZoo\PettingZoo.WPF\bin\Debug\net6.0-windows\PettingZoo.WPF.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\PresentationCore.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\PresentationFramework.Aero.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\PresentationFramework.Aero2.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\PresentationFramework.AeroLite.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\PresentationFramework.Classic.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\PresentationFramework.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\PresentationFramework.Luna.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\PresentationFramework.Royale.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\PresentationUI.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\ReachFramework.dll" />
<ReferencePath Include="C:\Users\PsychoMark\.nuget\packages\serilog\2.10.0\lib\netstandard2.1\Serilog.dll" />
<ReferencePath Include="C:\Users\PsychoMark\.nuget\packages\sharpvectors\1.7.7\lib\net5.0-windows\SharpVectors.Converters.Wpf.dll" />
<ReferencePath Include="C:\Users\PsychoMark\.nuget\packages\sharpvectors\1.7.7\lib\net5.0-windows\SharpVectors.Core.dll" />
<ReferencePath Include="C:\Users\PsychoMark\.nuget\packages\sharpvectors\1.7.7\lib\net5.0-windows\SharpVectors.Css.dll" />
<ReferencePath Include="C:\Users\PsychoMark\.nuget\packages\sharpvectors\1.7.7\lib\net5.0-windows\SharpVectors.Dom.dll" />
<ReferencePath Include="C:\Users\PsychoMark\.nuget\packages\sharpvectors\1.7.7\lib\net5.0-windows\SharpVectors.Model.dll" />
<ReferencePath Include="C:\Users\PsychoMark\.nuget\packages\sharpvectors\1.7.7\lib\net5.0-windows\SharpVectors.Rendering.Gdi.dll" />
<ReferencePath Include="C:\Users\PsychoMark\.nuget\packages\sharpvectors\1.7.7\lib\net5.0-windows\SharpVectors.Rendering.Wpf.dll" />
<ReferencePath Include="C:\Users\PsychoMark\.nuget\packages\sharpvectors\1.7.7\lib\net5.0-windows\SharpVectors.Runtime.Wpf.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.AppContext.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Buffers.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\System.CodeDom.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Collections.Concurrent.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Collections.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Collections.Immutable.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Collections.NonGeneric.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Collections.Specialized.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.ComponentModel.Annotations.dll" />
<ReferencePath Include="C:\Users\PsychoMark\.nuget\packages\system.componentmodel.composition\4.5.0\ref\netstandard2.0\System.ComponentModel.Composition.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.ComponentModel.DataAnnotations.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.ComponentModel.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.ComponentModel.EventBasedAsync.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.ComponentModel.Primitives.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.ComponentModel.TypeConverter.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\System.Configuration.ConfigurationManager.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Configuration.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Console.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Core.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Data.Common.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Data.DataSetExtensions.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Data.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\System.Design.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Diagnostics.Contracts.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Diagnostics.Debug.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Diagnostics.DiagnosticSource.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\System.Diagnostics.EventLog.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Diagnostics.FileVersionInfo.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\System.Diagnostics.PerformanceCounter.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Diagnostics.Process.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Diagnostics.StackTrace.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Diagnostics.TextWriterTraceListener.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Diagnostics.Tools.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Diagnostics.TraceSource.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Diagnostics.Tracing.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\System.DirectoryServices.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\System.Drawing.Common.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\System.Drawing.Design.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\System.Drawing.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Drawing.Primitives.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Dynamic.Runtime.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Formats.Asn1.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Globalization.Calendars.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Globalization.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Globalization.Extensions.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.IO.Compression.Brotli.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.IO.Compression.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.IO.Compression.FileSystem.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.IO.Compression.ZipFile.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.IO.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.IO.FileSystem.AccessControl.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.IO.FileSystem.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.IO.FileSystem.DriveInfo.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.IO.FileSystem.Primitives.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.IO.FileSystem.Watcher.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.IO.IsolatedStorage.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.IO.MemoryMappedFiles.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\System.IO.Packaging.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.IO.Pipes.AccessControl.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.IO.Pipes.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.IO.UnmanagedMemoryStream.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Linq.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Linq.Expressions.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Linq.Parallel.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Linq.Queryable.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Memory.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Net.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Net.Http.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Net.Http.Json.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Net.HttpListener.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Net.Mail.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Net.NameResolution.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Net.NetworkInformation.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Net.Ping.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Net.Primitives.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Net.Requests.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Net.Security.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Net.ServicePoint.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Net.Sockets.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Net.WebClient.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Net.WebHeaderCollection.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Net.WebProxy.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Net.WebSockets.Client.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Net.WebSockets.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Numerics.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Numerics.Vectors.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.ObjectModel.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\System.Printing.dll" />
<ReferencePath Include="C:\Users\PsychoMark\.nuget\packages\system.reactive\5.0.0\lib\net5.0\System.Reactive.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Reflection.DispatchProxy.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Reflection.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Reflection.Emit.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Reflection.Emit.ILGeneration.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Reflection.Emit.Lightweight.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Reflection.Extensions.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Reflection.Metadata.dll" />
<ReferencePath Include="C:\Users\PsychoMark\.nuget\packages\system.reflection.metadataloadcontext\6.0.0\lib\net6.0\System.Reflection.MetadataLoadContext.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Reflection.Primitives.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Reflection.TypeExtensions.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\System.Resources.Extensions.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Resources.Reader.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Resources.ResourceManager.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Resources.Writer.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Runtime.CompilerServices.Unsafe.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Runtime.CompilerServices.VisualC.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Runtime.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Runtime.Extensions.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Runtime.Handles.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Runtime.InteropServices.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Runtime.InteropServices.RuntimeInformation.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Runtime.Intrinsics.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Runtime.Loader.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Runtime.Numerics.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Runtime.Serialization.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Runtime.Serialization.Formatters.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Runtime.Serialization.Json.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Runtime.Serialization.Primitives.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Runtime.Serialization.Xml.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Security.AccessControl.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Security.Claims.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Security.Cryptography.Algorithms.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Security.Cryptography.Cng.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Security.Cryptography.Csp.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Security.Cryptography.Encoding.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Security.Cryptography.OpenSsl.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\System.Security.Cryptography.Pkcs.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Security.Cryptography.Primitives.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\System.Security.Cryptography.ProtectedData.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Security.Cryptography.X509Certificates.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\System.Security.Cryptography.Xml.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Security.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\System.Security.Permissions.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Security.Principal.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Security.Principal.Windows.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Security.SecureString.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.ServiceModel.Web.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.ServiceProcess.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Text.Encoding.CodePages.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Text.Encoding.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Text.Encoding.Extensions.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Text.Encodings.Web.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Text.Json.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Text.RegularExpressions.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\System.Threading.AccessControl.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Threading.Channels.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Threading.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Threading.Overlapped.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Threading.Tasks.Dataflow.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Threading.Tasks.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Threading.Tasks.Extensions.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Threading.Tasks.Parallel.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Threading.Thread.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Threading.ThreadPool.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Threading.Timer.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Transactions.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Transactions.Local.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.ValueTuple.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Web.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Web.HttpUtility.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\System.Windows.Controls.Ribbon.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Windows.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\System.Windows.Extensions.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\System.Windows.Forms.Design.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\System.Windows.Forms.Design.Editors.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\System.Windows.Forms.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\System.Windows.Forms.Primitives.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\System.Windows.Input.Manipulations.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\System.Windows.Presentation.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\System.Xaml.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Xml.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Xml.Linq.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Xml.ReaderWriter.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Xml.Serialization.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Xml.XDocument.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Xml.XmlDocument.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Xml.XmlSerializer.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Xml.XPath.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Xml.XPath.XDocument.dll" />
<ReferencePath Include="C:\Users\PsychoMark\.nuget\packages\tapeti.annotations\3.0.0\lib\netstandard2.0\Tapeti.Annotations.dll" />
<ReferencePath Include="C:\Users\PsychoMark\.nuget\packages\tapeti.dataannotations.extensions\3.0.0\lib\netstandard2.0\Tapeti.DataAnnotations.Extensions.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\UIAutomationClient.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\UIAutomationClientSideProviders.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\UIAutomationProvider.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\UIAutomationTypes.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\WindowsBase.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\WindowsFormsIntegration.dll" />
</ItemGroup>
<ItemGroup>
<Compile Include="P:\Development\PettingZoo\PettingZoo.Tapeti\obj\Debug\net6.0-windows\UI\ClassSelection\ClassSelectionWindow.g.cs" />
<Compile Include="P:\Development\PettingZoo\PettingZoo.Tapeti\obj\Debug\net6.0-windows\UI\PackageSelection\PackageSelectionWindow.g.cs" />
<Compile Include="P:\Development\PettingZoo\PettingZoo.Tapeti\obj\Debug\net6.0-windows\GeneratedInternalTypeHelper.g.cs" />
</ItemGroup>
<Import Project="Sdk.targets" Sdk="Microsoft.NET.Sdk" />
</Project>

View File

@ -11,8 +11,8 @@ using PettingZoo.Core.Settings;
using PettingZoo.Tapeti.AssemblyLoader; using PettingZoo.Tapeti.AssemblyLoader;
using PettingZoo.Tapeti.NuGet; using PettingZoo.Tapeti.NuGet;
using PettingZoo.Tapeti.UI.ClassSelection; using PettingZoo.Tapeti.UI.ClassSelection;
using PettingZoo.Tapeti.UI.PackageProgress;
using PettingZoo.Tapeti.UI.PackageSelection; using PettingZoo.Tapeti.UI.PackageSelection;
using PettingZoo.WPF.ProgressWindow;
using Serilog; using Serilog;
namespace PettingZoo.Tapeti namespace PettingZoo.Tapeti
@ -47,7 +47,7 @@ namespace PettingZoo.Tapeti
var windowBounds = selectionWindow.RestoreBounds; var windowBounds = selectionWindow.RestoreBounds;
selectionWindow.Close(); selectionWindow.Close();
var progressWindow = new PackageProgressWindow(); var progressWindow = new ProgressWindow(TapetiClassLibraryExampleGeneratorStrings.ProgressWindowTitle);
progressWindow.Left = windowBounds.Left + (windowBounds.Width - progressWindow.Width) / 2; progressWindow.Left = windowBounds.Left + (windowBounds.Width - progressWindow.Width) / 2;
progressWindow.Top = windowBounds.Top + (windowBounds.Height - progressWindow.Height) / 2; progressWindow.Top = windowBounds.Top + (windowBounds.Height - progressWindow.Height) / 2;
progressWindow.Show(); progressWindow.Show();

View File

@ -0,0 +1,72 @@
//------------------------------------------------------------------------------
// <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 PettingZoo.Tapeti {
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 TapetiClassLibraryExampleGeneratorStrings {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal TapetiClassLibraryExampleGeneratorStrings() {
}
/// <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("PettingZoo.Tapeti.TapetiClassLibraryExampleGeneratorStrings", typeof(TapetiClassLibraryExampleGeneratorStrings).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 string similar to Reading message classes....
/// </summary>
internal static string ProgressWindowTitle {
get {
return ResourceManager.GetString("ProgressWindowTitle", resourceCulture);
}
}
}
}

View File

@ -0,0 +1,123 @@
<?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=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="ProgressWindowTitle" xml:space="preserve">
<value>Reading message classes...</value>
</data>
</root>

View File

@ -17,6 +17,28 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Update="ProgressWindow\ProgressStrings.Designer.cs">
<DependentUpon>ProgressStrings.resx</DependentUpon>
<DesignTime>True</DesignTime>
<AutoGen>True</AutoGen>
</Compile>
<Compile Update="ProgressWindow\ProgressWindow.xaml.cs">
<SubType>Code</SubType>
</Compile>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Update="ProgressWindow\ProgressStrings.resx">
<LastGenOutput>ProgressStrings.Designer.cs</LastGenOutput>
<Generator>PublicResXFileCodeGenerator</Generator>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<Page Update="ProgressWindow\ProgressWindow.xaml">
<XamlRuntime>$(DefaultXamlRuntime)</XamlRuntime>
<SubType>Designer</SubType>
</Page>
<Page Update="Style.xaml"> <Page Update="Style.xaml">
<XamlRuntime>$(DefaultXamlRuntime)</XamlRuntime> <XamlRuntime>$(DefaultXamlRuntime)</XamlRuntime>
</Page> </Page>

View File

@ -8,7 +8,7 @@
// </auto-generated> // </auto-generated>
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
namespace PettingZoo.Tapeti.UI.PackageProgress { namespace PettingZoo.WPF.ProgressWindow {
using System; using System;
@ -22,14 +22,14 @@ namespace PettingZoo.Tapeti.UI.PackageProgress {
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
public class PackageProgressStrings { public class ProgressStrings {
private static global::System.Resources.ResourceManager resourceMan; private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture; private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal PackageProgressStrings() { internal ProgressStrings() {
} }
/// <summary> /// <summary>
@ -39,7 +39,7 @@ namespace PettingZoo.Tapeti.UI.PackageProgress {
public static global::System.Resources.ResourceManager ResourceManager { public static global::System.Resources.ResourceManager ResourceManager {
get { get {
if (object.ReferenceEquals(resourceMan, null)) { if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("PettingZoo.Tapeti.UI.PackageProgress.PackageProgressStrings", typeof(PackageProgressStrings).Assembly); global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("PettingZoo.WPF.ProgressWindow.ProgressStrings", typeof(ProgressStrings).Assembly);
resourceMan = temp; resourceMan = temp;
} }
return resourceMan; return resourceMan;
@ -68,14 +68,5 @@ namespace PettingZoo.Tapeti.UI.PackageProgress {
return ResourceManager.GetString("ButtonCancel", resourceCulture); return ResourceManager.GetString("ButtonCancel", resourceCulture);
} }
} }
/// <summary>
/// Looks up a localized string similar to Reading message classes....
/// </summary>
public static string WindowTitle {
get {
return ResourceManager.GetString("WindowTitle", resourceCulture);
}
}
} }
} }

View File

@ -120,7 +120,4 @@
<data name="ButtonCancel" xml:space="preserve"> <data name="ButtonCancel" xml:space="preserve">
<value>Cancel</value> <value>Cancel</value>
</data> </data>
<data name="WindowTitle" xml:space="preserve">
<value>Reading message classes...</value>
</data>
</root> </root>

View File

@ -1,17 +1,16 @@
<Window x:Class="PettingZoo.Tapeti.UI.PackageProgress.PackageProgressWindow" <Window x:Class="PettingZoo.WPF.ProgressWindow.ProgressWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:packageProgress="clr-namespace:PettingZoo.Tapeti.UI.PackageProgress" xmlns:progress="clr-namespace:PettingZoo.WPF.ProgressWindow"
mc:Ignorable="d" mc:Ignorable="d"
Width="400" Width="400"
Title="{x:Static packageProgress:PackageProgressStrings.WindowTitle}"
ResizeMode="NoResize" ResizeMode="NoResize"
WindowStyle="ToolWindow" WindowStyle="ToolWindow"
SizeToContent="Height"> SizeToContent="Height">
<StackPanel Orientation="Vertical"> <StackPanel Orientation="Vertical">
<ProgressBar Height="25" Margin="16" VerticalAlignment="Center" Name="Progress" Maximum="100" /> <ProgressBar Height="25" Margin="16" VerticalAlignment="Center" Name="Progress" Maximum="100" />
<Button HorizontalAlignment="Center" Margin="0,0,0,16" Content="{x:Static packageProgress:PackageProgressStrings.ButtonCancel}" Click="CancelButton_OnClick" /> <Button HorizontalAlignment="Center" Margin="0,0,0,16" Content="{x:Static progress:ProgressStrings.ButtonCancel}" Click="CancelButton_OnClick" />
</StackPanel> </StackPanel>
</Window> </Window>

View File

@ -3,21 +3,22 @@ using System.Threading;
using System.Windows; using System.Windows;
using System.Windows.Controls; using System.Windows.Controls;
namespace PettingZoo.Tapeti.UI.PackageProgress namespace PettingZoo.WPF.ProgressWindow
{ {
/// <summary> /// <summary>
/// Interaction logic for PackageProgressWindow.xaml /// Interaction logic for ProgressWindow.xaml
/// </summary> /// </summary>
public partial class PackageProgressWindow : IProgress<int> public partial class ProgressWindow : IProgress<int>
{ {
private readonly CancellationTokenSource cancellationTokenSource = new(); private readonly CancellationTokenSource cancellationTokenSource = new();
public CancellationToken CancellationToken => cancellationTokenSource.Token; public CancellationToken CancellationToken => cancellationTokenSource.Token;
public PackageProgressWindow() public ProgressWindow(string title)
{ {
InitializeComponent(); InitializeComponent();
Title = title;
Closed += (_, _) => Closed += (_, _) =>
{ {

View File

@ -0,0 +1,419 @@
<Project>
<PropertyGroup>
<AssemblyName>PettingZoo</AssemblyName>
<IntermediateOutputPath>obj\Debug\</IntermediateOutputPath>
<BaseIntermediateOutputPath>obj\</BaseIntermediateOutputPath>
<MSBuildProjectExtensionsPath>P:\Development\PettingZoo\PettingZoo\obj\</MSBuildProjectExtensionsPath>
<_TargetAssemblyProjectName>PettingZoo</_TargetAssemblyProjectName>
</PropertyGroup>
<Import Project="Sdk.props" Sdk="Microsoft.NET.Sdk" />
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net6.0-windows</TargetFramework>
<Version>0.1</Version>
<UseWPF>true</UseWPF>
<UseWindowsForms>true</UseWindowsForms>
<Authors>Mark van Renswoude</Authors>
<Product>Petting Zoo</Product>
<Description>Petting Zoo - a live RabbitMQ message viewer</Description>
<Copyright />
<Nullable>enable</Nullable>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
<StartupObject>PettingZoo.Program</StartupObject>
<PackageIcon>
</PackageIcon>
<PackageIconUrl />
<ApplicationIcon>PettingZoo.ico</ApplicationIcon>
</PropertyGroup>
<ItemGroup>
<None Remove="Images\Busy.svg" />
<None Remove="Images\Dock.svg" />
<None Remove="Images\Error.svg" />
<None Remove="Images\Example.svg" />
<None Remove="Images\Export.svg" />
<None Remove="Images\Folder.svg" />
<None Remove="Images\Import.svg" />
<None Remove="Images\Ok.svg" />
<None Remove="Images\PublishSend.svg" />
<None Remove="Images\Undock.svg" />
</ItemGroup>
<ItemGroup>
</ItemGroup>
<ItemGroup>
<PackageReference Include="AvalonEdit" Version="6.1.3.50" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
<PackageReference Include="Serilog" Version="2.10.0" />
<PackageReference Include="Serilog.Sinks.File" Version="5.0.0" />
<PackageReference Include="SharpVectors" Version="1.7.7" />
<PackageReference Include="SimpleInjector" Version="5.3.2" />
<PackageReference Include="System.Reactive" Version="5.0.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\PettingZoo.Core\PettingZoo.Core.csproj" />
<ProjectReference Include="..\PettingZoo.RabbitMQ\PettingZoo.RabbitMQ.csproj" />
<ProjectReference Include="..\PettingZoo.Settings.LiteDB\PettingZoo.Settings.LiteDB.csproj" />
<ProjectReference Include="..\PettingZoo.Tapeti\PettingZoo.Tapeti.csproj" />
<ProjectReference Include="..\PettingZoo.WPF\PettingZoo.WPF.csproj" />
</ItemGroup>
<ItemGroup>
</ItemGroup>
<ItemGroup>
<Compile Update="UI\Connection\ConnectionDisplayNameStrings.Designer.cs">
<DesignTime>True</DesignTime>
<AutoGen>True</AutoGen>
<DependentUpon>ConnectionDisplayNameStrings.resx</DependentUpon>
</Compile>
<Compile Update="UI\Connection\ConnectionWindowStrings.Designer.cs">
<DependentUpon>ConnectionWindowStrings.resx</DependentUpon>
<DesignTime>True</DesignTime>
<AutoGen>True</AutoGen>
</Compile>
<Compile Update="UI\Main\MainWindowStrings.Designer.cs">
<DependentUpon>MainWindowStrings.resx</DependentUpon>
<DesignTime>True</DesignTime>
<AutoGen>True</AutoGen>
</Compile>
<Compile Update="UI\Subscribe\SubscribeWindowStrings.Designer.cs">
<DependentUpon>SubscribeWindowStrings.resx</DependentUpon>
<DesignTime>True</DesignTime>
<AutoGen>True</AutoGen>
</Compile>
<Compile Update="UI\Tab\Publisher\PayloadEditorStrings.Designer.cs">
<DesignTime>True</DesignTime>
<AutoGen>True</AutoGen>
<DependentUpon>PayloadEditorStrings.resx</DependentUpon>
</Compile>
<Compile Update="UI\Tab\Publisher\TapetiPublisherViewStrings.Designer.cs">
<DependentUpon>TapetiPublisherViewStrings.resx</DependentUpon>
<DesignTime>True</DesignTime>
<AutoGen>True</AutoGen>
</Compile>
<Compile Update="UI\Tab\Publisher\TapetiPublisherView.xaml.cs">
<SubType>Code</SubType>
</Compile>
<Compile Update="UI\Tab\Publisher\RawPublisherViewStrings.Designer.cs">
<DependentUpon>RawPublisherViewStrings.resx</DependentUpon>
<DesignTime>True</DesignTime>
<AutoGen>True</AutoGen>
</Compile>
<Compile Update="UI\Tab\Publisher\PublisherViewStrings.Designer.cs">
<DependentUpon>PublisherViewStrings.resx</DependentUpon>
<DesignTime>True</DesignTime>
<AutoGen>True</AutoGen>
</Compile>
<Compile Update="UI\Tab\Subscriber\SubscriberViewStrings.Designer.cs">
<DependentUpon>SubscriberViewStrings.resx</DependentUpon>
<DesignTime>True</DesignTime>
<AutoGen>True</AutoGen>
</Compile>
<Compile Update="UI\Tab\Undocked\UndockedTabHostStrings.Designer.cs">
<DesignTime>True</DesignTime>
<AutoGen>True</AutoGen>
<DependentUpon>UndockedTabHostStrings.resx</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Update="UI\Connection\ConnectionDisplayNameStrings.resx">
<Generator>PublicResXFileCodeGenerator</Generator>
<LastGenOutput>ConnectionDisplayNameStrings.Designer.cs</LastGenOutput>
</EmbeddedResource>
<EmbeddedResource Update="UI\Connection\ConnectionWindowStrings.resx">
<LastGenOutput>ConnectionWindowStrings.Designer.cs</LastGenOutput>
<Generator>PublicResXFileCodeGenerator</Generator>
</EmbeddedResource>
<EmbeddedResource Update="UI\Main\MainWindowStrings.resx">
<LastGenOutput>MainWindowStrings.Designer.cs</LastGenOutput>
<Generator>PublicResXFileCodeGenerator</Generator>
</EmbeddedResource>
<EmbeddedResource Update="UI\Subscribe\SubscribeWindowStrings.resx">
<LastGenOutput>SubscribeWindowStrings.Designer.cs</LastGenOutput>
<Generator>PublicResXFileCodeGenerator</Generator>
</EmbeddedResource>
<EmbeddedResource Update="UI\Tab\Publisher\PayloadEditorStrings.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>PayloadEditorStrings.Designer.cs</LastGenOutput>
</EmbeddedResource>
<EmbeddedResource Update="UI\Tab\Publisher\TapetiPublisherViewStrings.resx">
<LastGenOutput>TapetiPublisherViewStrings.Designer.cs</LastGenOutput>
<Generator>PublicResXFileCodeGenerator</Generator>
</EmbeddedResource>
<EmbeddedResource Update="UI\Tab\Publisher\RawPublisherViewStrings.resx">
<LastGenOutput>RawPublisherViewStrings.Designer.cs</LastGenOutput>
<Generator>PublicResXFileCodeGenerator</Generator>
</EmbeddedResource>
<EmbeddedResource Update="UI\Tab\Publisher\PublisherViewStrings.resx">
<LastGenOutput>PublisherViewStrings.Designer.cs</LastGenOutput>
<Generator>PublicResXFileCodeGenerator</Generator>
</EmbeddedResource>
<EmbeddedResource Update="UI\Tab\Subscriber\SubscriberViewStrings.resx">
<LastGenOutput>SubscriberViewStrings.Designer.cs</LastGenOutput>
<Generator>PublicResXFileCodeGenerator</Generator>
</EmbeddedResource>
<EmbeddedResource Update="UI\Tab\Undocked\UndockedTabHostStrings.resx">
<Generator>PublicResXFileCodeGenerator</Generator>
<LastGenOutput>UndockedTabHostStrings.Designer.cs</LastGenOutput>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
</ItemGroup>
<ItemGroup>
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\Accessibility.dll" />
<ReferencePath Include="C:\Users\PsychoMark\.nuget\packages\avalonedit\6.1.3.50\lib\net6.0-windows7.0\ICSharpCode.AvalonEdit.dll" />
<ReferencePath Include="C:\Users\PsychoMark\.nuget\packages\litedb\5.0.11\lib\netstandard2.0\LiteDB.dll" />
<ReferencePath Include="C:\Users\PsychoMark\.nuget\packages\litedb.async\0.0.11\lib\netstandard2.0\litedbasync.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\Microsoft.CSharp.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\Microsoft.VisualBasic.Core.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\Microsoft.VisualBasic.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\Microsoft.VisualBasic.Forms.dll" />
<ReferencePath Include="C:\Users\PsychoMark\.nuget\packages\microsoft.web.xdt\3.0.0\lib\netstandard2.0\Microsoft.Web.XmlTransform.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\Microsoft.Win32.Primitives.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\Microsoft.Win32.Registry.AccessControl.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\Microsoft.Win32.Registry.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\Microsoft.Win32.SystemEvents.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\mscorlib.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\netstandard.dll" />
<ReferencePath Include="C:\Users\PsychoMark\.nuget\packages\newtonsoft.json\13.0.1\lib\netstandard2.0\Newtonsoft.Json.dll" />
<ReferencePath Include="C:\Users\PsychoMark\.nuget\packages\nuget.commands\6.0.0\lib\net5.0\NuGet.Commands.dll" />
<ReferencePath Include="C:\Users\PsychoMark\.nuget\packages\nuget.common\6.0.0\lib\netstandard2.0\NuGet.Common.dll" />
<ReferencePath Include="C:\Users\PsychoMark\.nuget\packages\nuget.configuration\6.0.0\lib\netstandard2.0\NuGet.Configuration.dll" />
<ReferencePath Include="C:\Users\PsychoMark\.nuget\packages\nuget.credentials\6.0.0\lib\net5.0\NuGet.Credentials.dll" />
<ReferencePath Include="C:\Users\PsychoMark\.nuget\packages\nuget.dependencyresolver.core\6.0.0\lib\net5.0\NuGet.DependencyResolver.Core.dll" />
<ReferencePath Include="C:\Users\PsychoMark\.nuget\packages\nuget.frameworks\6.0.0\lib\netstandard2.0\NuGet.Frameworks.dll" />
<ReferencePath Include="C:\Users\PsychoMark\.nuget\packages\nuget.librarymodel\6.0.0\lib\netstandard2.0\NuGet.LibraryModel.dll" />
<ReferencePath Include="C:\Users\PsychoMark\.nuget\packages\nuget.packagemanagement\6.0.0\lib\netstandard2.0\NuGet.PackageManagement.dll" />
<ReferencePath Include="C:\Users\PsychoMark\.nuget\packages\nuget.packaging\6.0.0\lib\net5.0\NuGet.Packaging.dll" />
<ReferencePath Include="C:\Users\PsychoMark\.nuget\packages\nuget.projectmodel\6.0.0\lib\net5.0\NuGet.ProjectModel.dll" />
<ReferencePath Include="C:\Users\PsychoMark\.nuget\packages\nuget.protocol\6.0.0\lib\net5.0\NuGet.Protocol.dll" />
<ReferencePath Include="C:\Users\PsychoMark\.nuget\packages\nuget.resolver\6.0.0\lib\net5.0\NuGet.Resolver.dll" />
<ReferencePath Include="C:\Users\PsychoMark\.nuget\packages\nuget.versioning\6.0.0\lib\netstandard2.0\NuGet.Versioning.dll" />
<ReferencePath Include="P:\Development\PettingZoo\PettingZoo.Core\bin\Debug\net6.0\PettingZoo.Core.dll" />
<ReferencePath Include="P:\Development\PettingZoo\PettingZoo.RabbitMQ\bin\Debug\net6.0\PettingZoo.RabbitMQ.dll" />
<ReferencePath Include="P:\Development\PettingZoo\PettingZoo.Settings.LiteDB\bin\Debug\net6.0\PettingZoo.Settings.LiteDB.dll" />
<ReferencePath Include="P:\Development\PettingZoo\PettingZoo.Tapeti\bin\Debug\net6.0-windows\PettingZoo.Tapeti.dll" />
<ReferencePath Include="P:\Development\PettingZoo\PettingZoo.WPF\bin\Debug\net6.0-windows\PettingZoo.WPF.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\PresentationCore.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\PresentationFramework.Aero.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\PresentationFramework.Aero2.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\PresentationFramework.AeroLite.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\PresentationFramework.Classic.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\PresentationFramework.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\PresentationFramework.Luna.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\PresentationFramework.Royale.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\PresentationUI.dll" />
<ReferencePath Include="C:\Users\PsychoMark\.nuget\packages\rabbitmq.client\6.2.2\lib\netstandard2.0\RabbitMQ.Client.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\ReachFramework.dll" />
<ReferencePath Include="C:\Users\PsychoMark\.nuget\packages\serilog\2.10.0\lib\netstandard2.1\Serilog.dll" />
<ReferencePath Include="C:\Users\PsychoMark\.nuget\packages\serilog.sinks.file\5.0.0\lib\net5.0\Serilog.Sinks.File.dll" />
<ReferencePath Include="C:\Users\PsychoMark\.nuget\packages\sharpvectors\1.7.7\lib\net5.0-windows\SharpVectors.Converters.Wpf.dll" />
<ReferencePath Include="C:\Users\PsychoMark\.nuget\packages\sharpvectors\1.7.7\lib\net5.0-windows\SharpVectors.Core.dll" />
<ReferencePath Include="C:\Users\PsychoMark\.nuget\packages\sharpvectors\1.7.7\lib\net5.0-windows\SharpVectors.Css.dll" />
<ReferencePath Include="C:\Users\PsychoMark\.nuget\packages\sharpvectors\1.7.7\lib\net5.0-windows\SharpVectors.Dom.dll" />
<ReferencePath Include="C:\Users\PsychoMark\.nuget\packages\sharpvectors\1.7.7\lib\net5.0-windows\SharpVectors.Model.dll" />
<ReferencePath Include="C:\Users\PsychoMark\.nuget\packages\sharpvectors\1.7.7\lib\net5.0-windows\SharpVectors.Rendering.Gdi.dll" />
<ReferencePath Include="C:\Users\PsychoMark\.nuget\packages\sharpvectors\1.7.7\lib\net5.0-windows\SharpVectors.Rendering.Wpf.dll" />
<ReferencePath Include="C:\Users\PsychoMark\.nuget\packages\sharpvectors\1.7.7\lib\net5.0-windows\SharpVectors.Runtime.Wpf.dll" />
<ReferencePath Include="C:\Users\PsychoMark\.nuget\packages\simpleinjector\5.3.2\lib\netstandard2.1\SimpleInjector.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.AppContext.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Buffers.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\System.CodeDom.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Collections.Concurrent.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Collections.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Collections.Immutable.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Collections.NonGeneric.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Collections.Specialized.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.ComponentModel.Annotations.dll" />
<ReferencePath Include="C:\Users\PsychoMark\.nuget\packages\system.componentmodel.composition\4.5.0\ref\netstandard2.0\System.ComponentModel.Composition.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.ComponentModel.DataAnnotations.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.ComponentModel.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.ComponentModel.EventBasedAsync.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.ComponentModel.Primitives.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.ComponentModel.TypeConverter.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\System.Configuration.ConfigurationManager.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Configuration.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Console.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Core.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Data.Common.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Data.DataSetExtensions.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Data.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\System.Design.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Diagnostics.Contracts.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Diagnostics.Debug.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Diagnostics.DiagnosticSource.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\System.Diagnostics.EventLog.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Diagnostics.FileVersionInfo.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\System.Diagnostics.PerformanceCounter.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Diagnostics.Process.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Diagnostics.StackTrace.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Diagnostics.TextWriterTraceListener.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Diagnostics.Tools.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Diagnostics.TraceSource.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Diagnostics.Tracing.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\System.DirectoryServices.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\System.Drawing.Common.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\System.Drawing.Design.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\System.Drawing.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Drawing.Primitives.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Dynamic.Runtime.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Formats.Asn1.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Globalization.Calendars.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Globalization.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Globalization.Extensions.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.IO.Compression.Brotli.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.IO.Compression.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.IO.Compression.FileSystem.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.IO.Compression.ZipFile.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.IO.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.IO.FileSystem.AccessControl.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.IO.FileSystem.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.IO.FileSystem.DriveInfo.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.IO.FileSystem.Primitives.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.IO.FileSystem.Watcher.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.IO.IsolatedStorage.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.IO.MemoryMappedFiles.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\System.IO.Packaging.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.IO.Pipes.AccessControl.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.IO.Pipes.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.IO.UnmanagedMemoryStream.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Linq.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Linq.Expressions.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Linq.Parallel.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Linq.Queryable.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Memory.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Net.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Net.Http.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Net.Http.Json.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Net.HttpListener.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Net.Mail.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Net.NameResolution.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Net.NetworkInformation.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Net.Ping.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Net.Primitives.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Net.Requests.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Net.Security.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Net.ServicePoint.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Net.Sockets.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Net.WebClient.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Net.WebHeaderCollection.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Net.WebProxy.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Net.WebSockets.Client.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Net.WebSockets.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Numerics.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Numerics.Vectors.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.ObjectModel.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\System.Printing.dll" />
<ReferencePath Include="C:\Users\PsychoMark\.nuget\packages\system.reactive\5.0.0\lib\net5.0\System.Reactive.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Reflection.DispatchProxy.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Reflection.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Reflection.Emit.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Reflection.Emit.ILGeneration.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Reflection.Emit.Lightweight.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Reflection.Extensions.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Reflection.Metadata.dll" />
<ReferencePath Include="C:\Users\PsychoMark\.nuget\packages\system.reflection.metadataloadcontext\6.0.0\lib\net6.0\System.Reflection.MetadataLoadContext.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Reflection.Primitives.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Reflection.TypeExtensions.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\System.Resources.Extensions.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Resources.Reader.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Resources.ResourceManager.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Resources.Writer.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Runtime.CompilerServices.Unsafe.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Runtime.CompilerServices.VisualC.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Runtime.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Runtime.Extensions.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Runtime.Handles.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Runtime.InteropServices.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Runtime.InteropServices.RuntimeInformation.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Runtime.Intrinsics.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Runtime.Loader.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Runtime.Numerics.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Runtime.Serialization.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Runtime.Serialization.Formatters.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Runtime.Serialization.Json.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Runtime.Serialization.Primitives.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Runtime.Serialization.Xml.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Security.AccessControl.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Security.Claims.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Security.Cryptography.Algorithms.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Security.Cryptography.Cng.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Security.Cryptography.Csp.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Security.Cryptography.Encoding.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Security.Cryptography.OpenSsl.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\System.Security.Cryptography.Pkcs.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Security.Cryptography.Primitives.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\System.Security.Cryptography.ProtectedData.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Security.Cryptography.X509Certificates.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\System.Security.Cryptography.Xml.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Security.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\System.Security.Permissions.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Security.Principal.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Security.Principal.Windows.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Security.SecureString.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.ServiceModel.Web.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.ServiceProcess.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Text.Encoding.CodePages.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Text.Encoding.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Text.Encoding.Extensions.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Text.Encodings.Web.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Text.Json.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Text.RegularExpressions.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\System.Threading.AccessControl.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Threading.Channels.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Threading.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Threading.Overlapped.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Threading.Tasks.Dataflow.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Threading.Tasks.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Threading.Tasks.Extensions.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Threading.Tasks.Parallel.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Threading.Thread.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Threading.ThreadPool.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Threading.Timer.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Transactions.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Transactions.Local.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.ValueTuple.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Web.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Web.HttpUtility.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\System.Windows.Controls.Ribbon.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Windows.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\System.Windows.Extensions.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\System.Windows.Forms.Design.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\System.Windows.Forms.Design.Editors.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\System.Windows.Forms.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\System.Windows.Forms.Primitives.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\System.Windows.Input.Manipulations.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\System.Windows.Presentation.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\System.Xaml.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Xml.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Xml.Linq.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Xml.ReaderWriter.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Xml.Serialization.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Xml.XDocument.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Xml.XmlDocument.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Xml.XmlSerializer.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Xml.XPath.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.1\ref\net6.0\System.Xml.XPath.XDocument.dll" />
<ReferencePath Include="C:\Users\PsychoMark\.nuget\packages\tapeti.annotations\3.0.0\lib\netstandard2.0\Tapeti.Annotations.dll" />
<ReferencePath Include="C:\Users\PsychoMark\.nuget\packages\tapeti.dataannotations.extensions\3.0.0\lib\netstandard2.0\Tapeti.DataAnnotations.Extensions.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\UIAutomationClient.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\UIAutomationClientSideProviders.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\UIAutomationProvider.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\UIAutomationTypes.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\WindowsBase.dll" />
<ReferencePath Include="C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.0\ref\net6.0\WindowsFormsIntegration.dll" />
</ItemGroup>
<ItemGroup>
<Compile Include="P:\Development\PettingZoo\PettingZoo\obj\Debug\net6.0-windows\UI\Connection\ConnectionDisplayNameDialog.g.cs" />
<Compile Include="P:\Development\PettingZoo\PettingZoo\obj\Debug\net6.0-windows\UI\Connection\ConnectionWindow.g.cs" />
<Compile Include="P:\Development\PettingZoo\PettingZoo\obj\Debug\net6.0-windows\UI\Main\MainWindow.g.cs" />
<Compile Include="P:\Development\PettingZoo\PettingZoo\obj\Debug\net6.0-windows\UI\Subscribe\SubscribeWindow.g.cs" />
<Compile Include="P:\Development\PettingZoo\PettingZoo\obj\Debug\net6.0-windows\UI\Tab\Publisher\PayloadEditorControl.g.cs" />
<Compile Include="P:\Development\PettingZoo\PettingZoo\obj\Debug\net6.0-windows\UI\Tab\Publisher\PublisherView.g.cs" />
<Compile Include="P:\Development\PettingZoo\PettingZoo\obj\Debug\net6.0-windows\UI\Tab\Publisher\RawPublisherView.g.cs" />
<Compile Include="P:\Development\PettingZoo\PettingZoo\obj\Debug\net6.0-windows\UI\Tab\Publisher\TapetiPublisherView.g.cs" />
<Compile Include="P:\Development\PettingZoo\PettingZoo\obj\Debug\net6.0-windows\UI\Tab\Subscriber\SubscriberView.g.cs" />
<Compile Include="P:\Development\PettingZoo\PettingZoo\obj\Debug\net6.0-windows\UI\Tab\Undocked\UndockedTabHostWindow.g.cs" />
<Compile Include="P:\Development\PettingZoo\PettingZoo\obj\Debug\net6.0-windows\App.g.cs" />
<Compile Include="P:\Development\PettingZoo\PettingZoo\obj\Debug\net6.0-windows\GeneratedInternalTypeHelper.g.cs" />
</ItemGroup>
<Import Project="Sdk.targets" Sdk="Microsoft.NET.Sdk" />
</Project>

View File

@ -4,7 +4,7 @@ using System.IO;
using System.Windows; using System.Windows;
using System.Windows.Markup; using System.Windows.Markup;
using PettingZoo.Core.Connection; using PettingZoo.Core.Connection;
using PettingZoo.Core.Export; using PettingZoo.Core.ExportImport;
using PettingZoo.Core.Generator; using PettingZoo.Core.Generator;
using PettingZoo.Core.Settings; using PettingZoo.Core.Settings;
using PettingZoo.RabbitMQ; using PettingZoo.RabbitMQ;
@ -82,10 +82,13 @@ namespace PettingZoo
container.Register<IConnectionSettingsRepository, LiteDBConnectionSettingsRepository>(); container.Register<IConnectionSettingsRepository, LiteDBConnectionSettingsRepository>();
container.Register<IUISettingsRepository, LiteDBUISettingsRepository>(); container.Register<IUISettingsRepository, LiteDBUISettingsRepository>();
container.Register<IExampleGenerator, TapetiClassLibraryExampleGenerator>(); container.Register<IExampleGenerator, TapetiClassLibraryExampleGenerator>();
container.Register<ITabHostProvider, TabHostProvider>(); container.RegisterSingleton<ITabHostProvider, TabHostProvider>();
container.Register<ITabFactory, ViewTabFactory>(); container.Register<ITabFactory, ViewTabFactory>();
container.RegisterInstance<IExportFormatProvider>(new ExportFormatProvider(new TapetiCmdExportFormat())); container.RegisterInstance<IExportImportFormatProvider>(new ExportImportFormatProvider(
new TapetiCmdExportFormat(),
new TapetiCmdImportFormat()
));
container.Register<MainWindow>(); container.Register<MainWindow>();

View File

@ -38,6 +38,13 @@
</StackPanel> </StackPanel>
</Button> </Button>
<Separator Style="{StaticResource {x:Static ToolBar.SeparatorStyleKey}}" /> <Separator Style="{StaticResource {x:Static ToolBar.SeparatorStyleKey}}" />
<Button Command="{Binding ImportCommand}">
<StackPanel Orientation="Horizontal">
<Image Source="{svgc:SvgImage Source=/Images/Import.svg, AppName=PettingZoo}" Width="16" Height="16" Style="{StaticResource ToolbarIcon}"/>
<TextBlock Margin="3,0,0,0" Text="{x:Static main:MainWindowStrings.CommandImport}" />
</StackPanel>
</Button>
<Separator Style="{StaticResource {x:Static ToolBar.SeparatorStyleKey}}" />
<Button Command="{Binding SubscribeCommand}"> <Button Command="{Binding SubscribeCommand}">
<StackPanel Orientation="Horizontal"> <StackPanel Orientation="Horizontal">
<Image Source="{svgc:SvgImage Source=/Images/Subscribe.svg, AppName=PettingZoo}" Width="16" Height="16" Style="{StaticResource ToolbarIcon}"/> <Image Source="{svgc:SvgImage Source=/Images/Subscribe.svg, AppName=PettingZoo}" Width="16" Height="16" Style="{StaticResource ToolbarIcon}"/>

View File

@ -5,9 +5,11 @@ using System.Windows.Controls;
using System.Windows.Input; using System.Windows.Input;
using System.Windows.Media; using System.Windows.Media;
using PettingZoo.Core.Connection; using PettingZoo.Core.Connection;
using PettingZoo.Core.ExportImport;
using PettingZoo.UI.Connection; using PettingZoo.UI.Connection;
using PettingZoo.UI.Subscribe; using PettingZoo.UI.Subscribe;
using PettingZoo.UI.Tab; using PettingZoo.UI.Tab;
using Serilog;
namespace PettingZoo.UI.Main namespace PettingZoo.UI.Main
{ {
@ -19,12 +21,12 @@ namespace PettingZoo.UI.Main
public bool WasMaximized; public bool WasMaximized;
public MainWindow(IConnectionFactory connectionFactory, IConnectionDialog connectionDialog, ISubscribeDialog subscribeDialog, public MainWindow(ILogger logger, IConnectionFactory connectionFactory, IConnectionDialog connectionDialog, ISubscribeDialog subscribeDialog,
ITabHostProvider tabHostProvider, ITabFactory tabFactory) ITabHostProvider tabHostProvider, ITabFactory tabFactory, IExportImportFormatProvider exportImportFormatProvider)
{ {
WindowStartupLocation = WindowStartupLocation.CenterScreen; WindowStartupLocation = WindowStartupLocation.CenterScreen;
viewModel = new MainWindowViewModel(connectionFactory, connectionDialog, subscribeDialog, this, tabHostProvider, tabFactory) viewModel = new MainWindowViewModel(logger, connectionFactory, connectionDialog, subscribeDialog, this, tabHostProvider, tabFactory, exportImportFormatProvider)
{ {
TabHostWindow = this TabHostWindow = this
}; };

View File

@ -78,6 +78,15 @@ namespace PettingZoo.UI.Main {
} }
} }
/// <summary>
/// Looks up a localized string similar to Import....
/// </summary>
public static string CommandImport {
get {
return ResourceManager.GetString("CommandImport", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to New Publisher. /// Looks up a localized string similar to New Publisher.
/// </summary> /// </summary>
@ -141,6 +150,15 @@ namespace PettingZoo.UI.Main {
} }
} }
/// <summary>
/// Looks up a localized string similar to Importing messages....
/// </summary>
public static string ImportProgressWindowTitle {
get {
return ResourceManager.GetString("ImportProgressWindowTitle", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Connected. /// Looks up a localized string similar to Connected.
/// </summary> /// </summary>

View File

@ -112,10 +112,10 @@
<value>2.0</value> <value>2.0</value>
</resheader> </resheader>
<resheader name="reader"> <resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader> </resheader>
<resheader name="writer"> <resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader> </resheader>
<data name="CommandConnect" xml:space="preserve"> <data name="CommandConnect" xml:space="preserve">
<value>Connect</value> <value>Connect</value>
@ -123,6 +123,9 @@
<data name="CommandDisconnect" xml:space="preserve"> <data name="CommandDisconnect" xml:space="preserve">
<value>Disconnect</value> <value>Disconnect</value>
</data> </data>
<data name="CommandImport" xml:space="preserve">
<value>Import...</value>
</data>
<data name="CommandPublish" xml:space="preserve"> <data name="CommandPublish" xml:space="preserve">
<value>New Publisher</value> <value>New Publisher</value>
</data> </data>
@ -144,6 +147,9 @@
<data name="DeliveryModePersistent" xml:space="preserve"> <data name="DeliveryModePersistent" xml:space="preserve">
<value>Persistent</value> <value>Persistent</value>
</data> </data>
<data name="ImportProgressWindowTitle" xml:space="preserve">
<value>Importing messages...</value>
</data>
<data name="StatusConnected" xml:space="preserve"> <data name="StatusConnected" xml:space="preserve">
<value>Connected</value> <value>Connected</value>
</data> </data>

View File

@ -1,16 +1,25 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
using System.IO;
using System.Linq; using System.Linq;
using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Windows; using System.Windows;
using System.Windows.Forms;
using System.Windows.Input; using System.Windows.Input;
using PettingZoo.Core.Connection; using PettingZoo.Core.Connection;
using PettingZoo.Core.ExportImport;
using PettingZoo.UI.Connection; using PettingZoo.UI.Connection;
using PettingZoo.UI.Subscribe; using PettingZoo.UI.Subscribe;
using PettingZoo.UI.Tab; using PettingZoo.UI.Tab;
using PettingZoo.UI.Tab.Subscriber;
using PettingZoo.UI.Tab.Undocked; using PettingZoo.UI.Tab.Undocked;
using PettingZoo.WPF.ProgressWindow;
using PettingZoo.WPF.ViewModel; using PettingZoo.WPF.ViewModel;
using Serilog;
using Application = System.Windows.Application;
using MessageBox = System.Windows.MessageBox;
namespace PettingZoo.UI.Main namespace PettingZoo.UI.Main
{ {
@ -24,12 +33,14 @@ namespace PettingZoo.UI.Main
public class MainWindowViewModel : BaseViewModel, IAsyncDisposable, ITabHost public class MainWindowViewModel : BaseViewModel, IAsyncDisposable, ITabHost
{ {
private readonly ILogger logger;
private readonly IConnectionFactory connectionFactory; private readonly IConnectionFactory connectionFactory;
private readonly IConnectionDialog connectionDialog; private readonly IConnectionDialog connectionDialog;
private readonly ISubscribeDialog subscribeDialog; private readonly ISubscribeDialog subscribeDialog;
private readonly ITabContainer tabContainer; private readonly ITabContainer tabContainer;
private readonly ITabHostProvider tabHostProvider; private readonly ITabHostProvider tabHostProvider;
private readonly ITabFactory tabFactory; private readonly ITabFactory tabFactory;
private readonly IExportImportFormatProvider exportImportFormatProvider;
private SubscribeDialogParams? subscribeDialogParams; private SubscribeDialogParams? subscribeDialogParams;
private IConnection? connection; private IConnection? connection;
@ -43,6 +54,7 @@ namespace PettingZoo.UI.Main
private readonly DelegateCommand subscribeCommand; private readonly DelegateCommand subscribeCommand;
private readonly DelegateCommand closeTabCommand; private readonly DelegateCommand closeTabCommand;
private readonly DelegateCommand undockTabCommand; private readonly DelegateCommand undockTabCommand;
private readonly DelegateCommand importCommand;
private ConnectionStatusType connectionStatusType; private ConnectionStatusType connectionStatusType;
@ -90,6 +102,7 @@ namespace PettingZoo.UI.Main
public ICommand SubscribeCommand => subscribeCommand; public ICommand SubscribeCommand => subscribeCommand;
public ICommand CloseTabCommand => closeTabCommand; public ICommand CloseTabCommand => closeTabCommand;
public ICommand UndockTabCommand => undockTabCommand; public ICommand UndockTabCommand => undockTabCommand;
public ICommand ImportCommand => importCommand;
public IEnumerable<TabToolbarCommand> ToolbarCommands => ActiveTab is ITabToolbarCommands tabToolbarCommands public IEnumerable<TabToolbarCommand> ToolbarCommands => ActiveTab is ITabToolbarCommands tabToolbarCommands
? tabToolbarCommands.ToolbarCommands ? tabToolbarCommands.ToolbarCommands
@ -102,17 +115,20 @@ namespace PettingZoo.UI.Main
Tabs.Count > 0 ? Visibility.Collapsed : Visibility.Visible; Tabs.Count > 0 ? Visibility.Collapsed : Visibility.Visible;
public MainWindowViewModel(IConnectionFactory connectionFactory, IConnectionDialog connectionDialog, public MainWindowViewModel(ILogger logger, IConnectionFactory connectionFactory, IConnectionDialog connectionDialog,
ISubscribeDialog subscribeDialog, ITabContainer tabContainer, ITabHostProvider tabHostProvider, ITabFactory tabFactory) ISubscribeDialog subscribeDialog, ITabContainer tabContainer, ITabHostProvider tabHostProvider, ITabFactory tabFactory,
IExportImportFormatProvider exportImportFormatProvider)
{ {
tabHostProvider.SetInstance(this); tabHostProvider.SetInstance(this);
this.logger = logger;
this.connectionFactory = connectionFactory; this.connectionFactory = connectionFactory;
this.connectionDialog = connectionDialog; this.connectionDialog = connectionDialog;
this.subscribeDialog = subscribeDialog; this.subscribeDialog = subscribeDialog;
this.tabContainer = tabContainer; this.tabContainer = tabContainer;
this.tabHostProvider = tabHostProvider; this.tabHostProvider = tabHostProvider;
this.tabFactory = tabFactory; this.tabFactory = tabFactory;
this.exportImportFormatProvider = exportImportFormatProvider;
connectionStatus = GetConnectionStatus(null); connectionStatus = GetConnectionStatus(null);
connectionStatusType = ConnectionStatusType.Error; connectionStatusType = ConnectionStatusType.Error;
@ -124,6 +140,7 @@ namespace PettingZoo.UI.Main
subscribeCommand = new DelegateCommand(SubscribeExecute, IsConnectedCanExecute); subscribeCommand = new DelegateCommand(SubscribeExecute, IsConnectedCanExecute);
closeTabCommand = new DelegateCommand(CloseTabExecute, HasActiveTabCanExecute); closeTabCommand = new DelegateCommand(CloseTabExecute, HasActiveTabCanExecute);
undockTabCommand = new DelegateCommand(UndockTabExecute, HasActiveTabCanExecute); undockTabCommand = new DelegateCommand(UndockTabExecute, HasActiveTabCanExecute);
importCommand = new DelegateCommand(ImportExecute);
} }
@ -236,6 +253,87 @@ namespace PettingZoo.UI.Main
} }
private void ImportExecute()
{
var formats = exportImportFormatProvider.ImportFormats.ToArray();
var dialog = new OpenFileDialog
{
Filter = string.Join('|', formats.Select(f => f.Filter))
};
if (dialog.ShowDialog() != DialogResult.OK)
return;
if (dialog.FilterIndex <= 0 || dialog.FilterIndex > formats.Length)
return;
var filename = dialog.FileName;
var format = formats[dialog.FilterIndex - 1];
var progressWindow = new ProgressWindow(MainWindowStrings.ImportProgressWindowTitle)
{
Owner = TabHostWindow,
WindowStartupLocation = WindowStartupLocation.CenterOwner
};
progressWindow.Show();
Task.Run(async () =>
{
try
{
IReadOnlyList<ReceivedMessageInfo> messages;
await using (var importFile =
new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read))
{
messages = await format.Import(
new StreamProgressDecorator(importFile, progressWindow).Stream,
progressWindow.CancellationToken);
}
if (progressWindow.CancellationToken.IsCancellationRequested)
return;
await Application.Current.Dispatcher.BeginInvoke(() =>
{
progressWindow.Close();
progressWindow = null;
AddTab(tabFactory.CreateSubscriberTab(connection,
new ImportSubscriber(filename, messages)));
});
}
catch (OperationCanceledException)
{
// User cancelled
}
catch (Exception e)
{
logger.Error(e, "Error while importing messages");
await Application.Current.Dispatcher.BeginInvoke(() =>
{
progressWindow?.Close();
progressWindow = null;
MessageBox.Show(string.Format(SubscriberViewStrings.ExportError, e.Message),
SubscriberViewStrings.ExportResultTitle,
MessageBoxButton.OK, MessageBoxImage.Information);
});
}
finally
{
if (progressWindow != null)
await Application.Current.Dispatcher.BeginInvoke(() =>
{
progressWindow.Close();
});
}
}, CancellationToken.None);
}
private ITab? RemoveActiveTab() private ITab? RemoveActiveTab()
{ {
if (ActiveTab == null) if (ActiveTab == null)
@ -332,8 +430,18 @@ namespace PettingZoo.UI.Main
public class DesignTimeMainWindowViewModel : MainWindowViewModel public class DesignTimeMainWindowViewModel : MainWindowViewModel
{ {
public DesignTimeMainWindowViewModel() : base(null!, null!, null!, null!, null!, null!) public DesignTimeMainWindowViewModel() : base(null!, null!, null!, null!, null!, new DesignTimeTabHostProvider(), null!, null!)
{ {
} }
private class DesignTimeTabHostProvider : ITabHostProvider
{
public ITabHost Instance => null!;
public void SetInstance(ITabHost instance)
{
}
}
} }
} }

View File

@ -8,7 +8,7 @@ namespace PettingZoo.UI.Tab
public interface ITabFactory public interface ITabFactory
{ {
ITab CreateSubscriberTab(IConnection connection, ISubscriber subscriber); ITab CreateSubscriberTab(IConnection? connection, ISubscriber subscriber);
ITab CreatePublisherTab(IConnection connection, ReceivedMessageInfo? fromReceivedMessage = null); ITab CreatePublisherTab(IConnection connection, ReceivedMessageInfo? fromReceivedMessage = null);
} }
} }

View File

@ -6,14 +6,18 @@ using System.Text;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Windows; using System.Windows;
using System.Windows.Forms;
using System.Windows.Input; using System.Windows.Input;
using Microsoft.Win32;
using PettingZoo.Core.Connection; using PettingZoo.Core.Connection;
using PettingZoo.Core.Export; using PettingZoo.Core.ExportImport;
using PettingZoo.Core.Rendering; using PettingZoo.Core.Rendering;
using PettingZoo.WPF.ProgressWindow;
using PettingZoo.WPF.ViewModel; using PettingZoo.WPF.ViewModel;
using Serilog; using Serilog;
using Application = System.Windows.Application;
using IConnection = PettingZoo.Core.Connection.IConnection; using IConnection = PettingZoo.Core.Connection.IConnection;
using MessageBox = System.Windows.MessageBox;
using Timer = System.Threading.Timer;
namespace PettingZoo.UI.Tab.Subscriber namespace PettingZoo.UI.Tab.Subscriber
{ {
@ -22,9 +26,9 @@ namespace PettingZoo.UI.Tab.Subscriber
private readonly ILogger logger; private readonly ILogger logger;
private readonly ITabHostProvider tabHostProvider; private readonly ITabHostProvider tabHostProvider;
private readonly ITabFactory tabFactory; private readonly ITabFactory tabFactory;
private readonly IConnection connection; private readonly IConnection? connection;
private readonly ISubscriber subscriber; private readonly ISubscriber subscriber;
private readonly IExportFormatProvider exportFormatProvider; private readonly IExportImportFormatProvider exportImportFormatProvider;
private ReceivedMessageInfo? selectedMessage; private ReceivedMessageInfo? selectedMessage;
private readonly DelegateCommand clearCommand; private readonly DelegateCommand clearCommand;
private readonly DelegateCommand exportCommand; private readonly DelegateCommand exportCommand;
@ -78,16 +82,18 @@ namespace PettingZoo.UI.Tab.Subscriber
public IEnumerable<TabToolbarCommand> ToolbarCommands => toolbarCommands; public IEnumerable<TabToolbarCommand> ToolbarCommands => toolbarCommands;
public SubscriberViewModel(ILogger logger, ITabHostProvider tabHostProvider, ITabFactory tabFactory, IConnection connection, ISubscriber subscriber, IExportFormatProvider exportFormatProvider) public SubscriberViewModel(ILogger logger, ITabHostProvider tabHostProvider, ITabFactory tabFactory, IConnection? connection, ISubscriber subscriber, IExportImportFormatProvider exportImportFormatProvider)
{ {
this.logger = logger; this.logger = logger;
this.tabHostProvider = tabHostProvider; this.tabHostProvider = tabHostProvider;
this.tabFactory = tabFactory; this.tabFactory = tabFactory;
this.connection = connection; this.connection = connection;
this.subscriber = subscriber; this.subscriber = subscriber;
this.exportFormatProvider = exportFormatProvider; this.exportImportFormatProvider = exportImportFormatProvider;
Messages = new ObservableCollectionEx<ReceivedMessageInfo>(); Messages = new ObservableCollectionEx<ReceivedMessageInfo>();
Messages.AddRange(subscriber.GetInitialMessages());
UnreadMessages = new ObservableCollectionEx<ReceivedMessageInfo>(); UnreadMessages = new ObservableCollectionEx<ReceivedMessageInfo>();
clearCommand = new DelegateCommand(ClearExecute, HasMessagesCanExecute); clearCommand = new DelegateCommand(ClearExecute, HasMessagesCanExecute);
@ -130,14 +136,14 @@ namespace PettingZoo.UI.Tab.Subscriber
private void ExportExecute() private void ExportExecute()
{ {
var formats = exportFormatProvider.Formats.ToArray(); var formats = exportImportFormatProvider.ExportFormats.ToArray();
var dialog = new SaveFileDialog var dialog = new SaveFileDialog
{ {
Filter = string.Join('|', formats.Select(f => f.Filter)) Filter = string.Join('|', formats.Select(f => f.Filter))
}; };
if (!dialog.ShowDialog().GetValueOrDefault()) if (dialog.ShowDialog() != DialogResult.OK)
return; return;
// 1-based? Seriously? // 1-based? Seriously?
@ -148,37 +154,74 @@ namespace PettingZoo.UI.Tab.Subscriber
var filename = dialog.FileName; var filename = dialog.FileName;
var format = formats[dialog.FilterIndex - 1]; var format = formats[dialog.FilterIndex - 1];
var progressWindow = new ProgressWindow(SubscriberViewStrings.ExportProgressWindowTitle)
{
Owner = Application.Current.MainWindow, // TODO I forgot if we have access to our host window here (which can be main or undocked), would be nicer if we did
WindowStartupLocation = WindowStartupLocation.CenterOwner
};
progressWindow.Show();
Task.Run(async () => Task.Run(async () =>
{ {
try try
{ {
await using var exportFile = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.Read); await using (var exportFile = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.Read))
await format.Export(exportFile, messages); {
await format.Export(
exportFile,
new ListEnumerableProgressDecorator<ReceivedMessageInfo>(messages, progressWindow),
progressWindow.CancellationToken);
}
if (progressWindow.CancellationToken.IsCancellationRequested)
return;
await Application.Current.Dispatcher.BeginInvoke(() => await Application.Current.Dispatcher.BeginInvoke(() =>
{ {
progressWindow.Close();
progressWindow = null;
MessageBox.Show(string.Format(SubscriberViewStrings.ExportSuccess, messages.Length, filename), MessageBox.Show(string.Format(SubscriberViewStrings.ExportSuccess, messages.Length, filename),
SubscriberViewStrings.ExportResultTitle, SubscriberViewStrings.ExportResultTitle,
MessageBoxButton.OK, MessageBoxImage.Information); MessageBoxButton.OK, MessageBoxImage.Information);
}); });
} }
catch (OperationCanceledException)
{
// User cancelled
}
catch (Exception e) catch (Exception e)
{ {
logger.Error(e, "Error while exporting messages"); logger.Error(e, "Error while exporting messages");
await Application.Current.Dispatcher.BeginInvoke(() => await Application.Current.Dispatcher.BeginInvoke(() =>
{ {
progressWindow?.Close();
progressWindow = null;
MessageBox.Show(string.Format(SubscriberViewStrings.ExportError, e.Message), MessageBox.Show(string.Format(SubscriberViewStrings.ExportError, e.Message),
SubscriberViewStrings.ExportResultTitle, SubscriberViewStrings.ExportResultTitle,
MessageBoxButton.OK, MessageBoxImage.Information); MessageBoxButton.OK, MessageBoxImage.Information);
}); });
} }
finally
{
if (progressWindow != null)
await Application.Current.Dispatcher.BeginInvoke(() =>
{
progressWindow.Close();
});
}
}); });
} }
private void CreatePublisherExecute() private void CreatePublisherExecute()
{ {
if (connection == null)
return;
var publisherTab = tabFactory.CreatePublisherTab(connection, SelectedMessage); var publisherTab = tabFactory.CreatePublisherTab(connection, SelectedMessage);
tabHostProvider.Instance.AddTab(publisherTab); tabHostProvider.Instance.AddTab(publisherTab);
} }
@ -186,7 +229,7 @@ namespace PettingZoo.UI.Tab.Subscriber
private bool CreatePublisherCanExecute() private bool CreatePublisherCanExecute()
{ {
return SelectedMessage != null; return connection != null && SelectedMessage != null;
} }
@ -311,9 +354,16 @@ namespace PettingZoo.UI.Tab.Subscriber
public event EventHandler<MessageReceivedEventArgs>? MessageReceived; public event EventHandler<MessageReceivedEventArgs>? MessageReceived;
#pragma warning restore CS0067 #pragma warning restore CS0067
public IEnumerable<ReceivedMessageInfo> GetInitialMessages()
{
return Enumerable.Empty<ReceivedMessageInfo>();
}
public void Start() public void Start()
{ {
} }
} }
} }
} }

View File

@ -114,6 +114,15 @@ namespace PettingZoo.UI.Tab.Subscriber {
} }
} }
/// <summary>
/// Looks up a localized string similar to Exporting messages....
/// </summary>
public static string ExportProgressWindowTitle {
get {
return ResourceManager.GetString("ExportProgressWindowTitle", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Export. /// Looks up a localized string similar to Export.
/// </summary> /// </summary>

View File

@ -135,6 +135,9 @@
<data name="ExportError" xml:space="preserve"> <data name="ExportError" xml:space="preserve">
<value>Error while exporting messages: {0}</value> <value>Error while exporting messages: {0}</value>
</data> </data>
<data name="ExportProgressWindowTitle" xml:space="preserve">
<value>Exporting messages...</value>
</data>
<data name="ExportResultTitle" xml:space="preserve"> <data name="ExportResultTitle" xml:space="preserve">
<value>Export</value> <value>Export</value>
</data> </data>

View File

@ -1,5 +1,5 @@
using PettingZoo.Core.Connection; using PettingZoo.Core.Connection;
using PettingZoo.Core.Export; using PettingZoo.Core.ExportImport;
using PettingZoo.Core.Generator; using PettingZoo.Core.Generator;
using PettingZoo.UI.Tab.Publisher; using PettingZoo.UI.Tab.Publisher;
using PettingZoo.UI.Tab.Subscriber; using PettingZoo.UI.Tab.Subscriber;
@ -12,21 +12,21 @@ namespace PettingZoo.UI.Tab
private readonly ILogger logger; private readonly ILogger logger;
private readonly ITabHostProvider tabHostProvider; private readonly ITabHostProvider tabHostProvider;
private readonly IExampleGenerator exampleGenerator; private readonly IExampleGenerator exampleGenerator;
private readonly IExportFormatProvider exportFormatProvider; private readonly IExportImportFormatProvider exportImportFormatProvider;
public ViewTabFactory(ILogger logger, ITabHostProvider tabHostProvider, IExampleGenerator exampleGenerator, IExportFormatProvider exportFormatProvider) public ViewTabFactory(ILogger logger, ITabHostProvider tabHostProvider, IExampleGenerator exampleGenerator, IExportImportFormatProvider exportImportFormatProvider)
{ {
this.logger = logger; this.logger = logger;
this.tabHostProvider = tabHostProvider; this.tabHostProvider = tabHostProvider;
this.exampleGenerator = exampleGenerator; this.exampleGenerator = exampleGenerator;
this.exportFormatProvider = exportFormatProvider; this.exportImportFormatProvider = exportImportFormatProvider;
} }
public ITab CreateSubscriberTab(IConnection connection, ISubscriber subscriber) public ITab CreateSubscriberTab(IConnection? connection, ISubscriber subscriber)
{ {
var viewModel = new SubscriberViewModel(logger, tabHostProvider, this, connection, subscriber, exportFormatProvider); var viewModel = new SubscriberViewModel(logger, tabHostProvider, this, connection, subscriber, exportImportFormatProvider);
return new ViewTab<SubscriberView, SubscriberViewModel>( return new ViewTab<SubscriberView, SubscriberViewModel>(
new SubscriberView(viewModel), new SubscriberView(viewModel),
viewModel, viewModel,