Skip to content

Commit

Permalink
https://github.com/morganstanley/ComposeUI/issues/47
Browse files Browse the repository at this point in the history
added minimal nuber of plugins and prototypes
  • Loading branch information
polyanic committed Jul 25, 2022
1 parent 70a336f commit 29ee51d
Show file tree
Hide file tree
Showing 29 changed files with 1,947 additions and 0 deletions.

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<Application xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="MorganStanley.ComposeUI.Prototypes.NoPluginsPrototype.App">
<Application.Styles>
<StyleInclude Source="avares://Avalonia.Themes.Default/Accents/BaseLight.xaml"/>
<StyleInclude Source="avares://Avalonia.Themes.Default/DefaultTheme.xaml"/>
<StyleInclude Source="avares://NP.Avalonia.Visuals/Themes/CustomWindowStyles.axaml"/>
<StyleInclude Source="avares://NP.Avalonia.UniDock/Themes/DockStyles.axaml"/>
</Application.Styles>
</Application>
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
using Avalonia;
using Avalonia.Controls.ApplicationLifetimes;
using Avalonia.Markup.Xaml;
using NP.Avalonia.Gidon;
using NP.IoCy;
using NP.NLogAdapter;

namespace MorganStanley.ComposeUI.Prototypes.NoPluginsPrototype
{
public class App : Application
{
/// defined the Gidon plugin manager
/// use the following paths (relative to the NoPluginsPrototype.exe executable)
/// to dynamically load the plugins and services:
/// "Plugins/Services" - to load the services (non-visual singletons)
/// "Plugins/ViewModelPlugins" - to load view model plugins
/// "Plugins/ViewPlugins" - to load view plugins
public static PluginManager ThePluginManager { get; } =
new PluginManager
(
"Plugins/Services",
"Plugins/ViewModelPlugins",
"Plugins/ViewPlugins");

// the IoC container
public static IoCContainer TheContainer => ThePluginManager.TheContainer;

public App()
{
// inject a type from a statically loaded project NLogAdapter
ThePluginManager.InjectType(typeof(NLogWrapper));

// inject all dynamically loaded assemblies
ThePluginManager.CompleteConfiguration();
}

public override void Initialize()
{
AvaloniaXamlLoader.Load(this);
}

public override void OnFrameworkInitializationCompleted()
{
if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
{
desktop.MainWindow = new MainWindow();
}

base.OnFrameworkInitializationCompleted();
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<!--
********************************************************************************************************
Morgan Stanley makes this available to you under the Apache License, Version 2.0 (the "License").
You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.
See the NOTICE file distributed with this work for additional information regarding copyright ownership.
Unless required by applicable law or agreed to in writing, software distributed under the License
is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and limitations under the License.
********************************************************************************************************
-->
<Window xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:utils="clr-namespace:NP.Utilities.PluginUtils;assembly=NP.Utilities"
xmlns:basicServices="clr-namespace:NP.Utilities.BasicServices;assembly=NP.Utilities"
xmlns:np="https://np.com/visuals"
xmlns:local="clr-namespace:MorganStanley.ComposeUI.Prototypes.NoPluginsPrototype"
x:Class="MorganStanley.ComposeUI.Prototypes.NoPluginsPrototype.MainWindow"
Title="Plugins Test"
Width="600"
Height="400">
<Grid>
</Grid>
</Window>
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
/// ********************************************************************************************************
///
/// Morgan Stanley makes this available to you under the Apache License, Version 2.0 (the "License").
/// You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.
/// See the NOTICE file distributed with this work for additional information regarding copyright ownership.
/// Unless required by applicable law or agreed to in writing, software distributed under the License
/// is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
/// See the License for the specific language governing permissions and limitations under the License.
///
/// ********************************************************************************************************

using Avalonia.Controls;

namespace MorganStanley.ComposeUI.Prototypes.NoPluginsPrototype
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
<!--
********************************************************************************************************
Morgan Stanley makes this available to you under the Apache License, Version 2.0 (the "License").
You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.
See the NOTICE file distributed with this work for additional information regarding copyright ownership.
Unless required by applicable law or agreed to in writing, software distributed under the License
is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and limitations under the License.
********************************************************************************************************
-->
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<Nullable>enable</Nullable>
<!--Avalonia doesen't support TrimMode=link currently,but we are working on that https://github.com/AvaloniaUI/Avalonia/issues/6892 -->
<TrimMode>copyused</TrimMode>
<BuiltInComInteropSupport>true</BuiltInComInteropSupport>
</PropertyGroup>
<ItemGroup>
<None Remove=".gitignore" />
</ItemGroup>
<ItemGroup>
<!--This helps with theme dll-s trimming.
If you will publish your application in self-contained mode with p:PublishTrimmed=true and it will use Fluent theme Default theme will be trimmed from the output and vice versa.
https://github.com/AvaloniaUI/Avalonia/issues/5593 -->
<TrimmableAssembly Include="Avalonia.Themes.Fluent" />
<TrimmableAssembly Include="Avalonia.Themes.Default" />
</ItemGroup>
<ItemGroup>
<!--Condition below is needed to remove Avalonia.Diagnostics package from build output in Release configuration.-->
<PackageReference Include="NP.Avalonia.Gidon" Version="0.99.3" />
<PackageReference Include="NP.NLogAdapter" Version="1.0.5" />
<PackageReference Include="XamlNameReferenceGenerator" Version="1.3.4" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\Tryouts\Core\MorganStanley.ComposeUI.Tryouts.BasicModels\MorganStanley.ComposeUI.Tryouts.BasicModels.csproj" />
<ProjectReference Include="..\..\Tryouts\Core\MorganStanley.ComposeUI.Tryouts.Interfaces\MorganStanley.ComposeUI.Tryouts.Interfaces.csproj" />
<ProjectReference Include="..\..\Tryouts\Core\MorganStanley.ComposeUI.Tryouts.Utilities\MorganStanley.ComposeUI.Tryouts.Utilities.csproj" />
<ProjectReference Include="..\..\Tryouts\Visuals\Avalonia\MorganStanley.ComposeUI.Tryouts.VisualUtils\MorganStanley.ComposeUI.Tryouts.Avalonia.VisualUtils.csproj" />
</ItemGroup>
</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.0.32112.339
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MorganStanley.ComposeUI.Prototypes.NoPluginsPrototype", "MorganStanley.ComposeUI.Prototypes.NoPluginsPrototype.csproj", "{49279A6F-C9BC-4EFF-BBBB-72789599A46C}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Common", "Common", "{1ED5A035-825C-40C9-95F9-F0E275F3187A}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MorganStanley.ComposeUI.Common.BasicModels", "..\..\src\Common\Core\MorganStanley.ComposeUI.Common.BasicModels\MorganStanley.ComposeUI.Common.BasicModels.csproj", "{40EC45C4-0325-4851-AB1C-64B27ED28BAD}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MorganStanley.ComposeUI.Common.Interfaces", "..\..\src\Common\Core\MorganStanley.ComposeUI.Common.Interfaces\MorganStanley.ComposeUI.Common.Interfaces.csproj", "{D5EBE540-94D0-4E33-A467-C3BDAD5DCB14}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MorganStanley.ComposeUI.Common.Utilities", "..\..\src\Common\Core\MorganStanley.ComposeUI.Common.Utilities\MorganStanley.ComposeUI.Common.Utilities.csproj", "{60A6B771-3B8B-4CF7-81F7-E8D1A20E22CC}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MorganStanley.ComposeUI.Avalonia.VisualUtils", "..\..\src\Common\Visuals\Avalonia\MorganStanley.ComposeUI.Common.VisualUtils\MorganStanley.ComposeUI.Avalonia.VisualUtils.csproj", "{AD4ABE76-2E9D-49E2-AFD5-2722D410A987}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tryouts", "Tryouts", "{2D94959E-539E-43A8-B50D-435D969059FF}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MorganStanley.ComposeUI.Tryouts.BasicModels", "..\..\Tryouts\Core\MorganStanley.ComposeUI.Tryouts.BasicModels\MorganStanley.ComposeUI.Tryouts.BasicModels.csproj", "{D25CF673-216B-450C-840A-039ECF088CB7}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MorganStanley.ComposeUI.Tryouts.Interfaces", "..\..\Tryouts\Core\MorganStanley.ComposeUI.Tryouts.Interfaces\MorganStanley.ComposeUI.Tryouts.Interfaces.csproj", "{6BCE1270-464D-42CB-B07E-1B0A88A70D6F}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MorganStanley.ComposeUI.Tryouts.Utilities", "..\..\Tryouts\Core\MorganStanley.ComposeUI.Tryouts.Utilities\MorganStanley.ComposeUI.Tryouts.Utilities.csproj", "{E2CC1CB0-7895-4A50-B62A-20F313A4C3B0}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MorganStanley.ComposeUI.Tryouts.Avalonia.VisualUtils", "..\..\Tryouts\Visuals\Avalonia\MorganStanley.ComposeUI.Tryouts.VisualUtils\MorganStanley.ComposeUI.Tryouts.Avalonia.VisualUtils.csproj", "{AE26BC29-2929-4A96-9789-1039D7806D98}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Plugins", "Plugins", "{B530EC0C-92A5-445F-8938-DBCD083DCF19}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Plugins", "Plugins", "{713AD7B2-EB14-40B5-A49F-6447C3F5254A}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Services", "Services", "{D1DC0BB5-C429-4192-BF01-EF58D6B0F9AB}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ViewViewModelPlugins", "ViewViewModelPlugins", "{E83B541E-8621-47EA-8227-A36A196A66E0}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Services", "Services", "{E6C5099B-43B2-480E-8AD7-CBE18D807E92}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ViewViewModelPlugins", "ViewViewModelPlugins", "{CDB0B36B-D97F-44B9-AB7C-13CAB544312A}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{7D1B20B1-5314-4746-B6D4-372E0E5B875F}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Visuals", "Visuals", "{C445A0CF-5BB5-4D81-BB70-04A0AA098167}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Avalonia", "Avalonia", "{78471569-A5AA-4473-9F70-74B75B4E899C}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{E8259067-6649-4246-9DE8-7837F8163F68}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Visuals", "Visuals", "{F7A7A3A5-1B08-419A-8B69-A6874B97E06D}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Avalonia", "Avalonia", "{E32C4F1E-0DB6-4171-BA5E-F61276E37081}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "javascript-binding", "javascript-binding", "{23674AB6-9EF1-4400-9F0A-048CE74EB1BB}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "javascript-binding", "javascript-binding", "{282D0B3E-D1F9-45B6-8CE2-D055F6479672}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{49279A6F-C9BC-4EFF-BBBB-72789599A46C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{49279A6F-C9BC-4EFF-BBBB-72789599A46C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{49279A6F-C9BC-4EFF-BBBB-72789599A46C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{49279A6F-C9BC-4EFF-BBBB-72789599A46C}.Release|Any CPU.Build.0 = Release|Any CPU
{40EC45C4-0325-4851-AB1C-64B27ED28BAD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{40EC45C4-0325-4851-AB1C-64B27ED28BAD}.Debug|Any CPU.Build.0 = Debug|Any CPU
{40EC45C4-0325-4851-AB1C-64B27ED28BAD}.Release|Any CPU.ActiveCfg = Release|Any CPU
{40EC45C4-0325-4851-AB1C-64B27ED28BAD}.Release|Any CPU.Build.0 = Release|Any CPU
{D5EBE540-94D0-4E33-A467-C3BDAD5DCB14}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D5EBE540-94D0-4E33-A467-C3BDAD5DCB14}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D5EBE540-94D0-4E33-A467-C3BDAD5DCB14}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D5EBE540-94D0-4E33-A467-C3BDAD5DCB14}.Release|Any CPU.Build.0 = Release|Any CPU
{60A6B771-3B8B-4CF7-81F7-E8D1A20E22CC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{60A6B771-3B8B-4CF7-81F7-E8D1A20E22CC}.Debug|Any CPU.Build.0 = Debug|Any CPU
{60A6B771-3B8B-4CF7-81F7-E8D1A20E22CC}.Release|Any CPU.ActiveCfg = Release|Any CPU
{60A6B771-3B8B-4CF7-81F7-E8D1A20E22CC}.Release|Any CPU.Build.0 = Release|Any CPU
{AD4ABE76-2E9D-49E2-AFD5-2722D410A987}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{AD4ABE76-2E9D-49E2-AFD5-2722D410A987}.Debug|Any CPU.Build.0 = Debug|Any CPU
{AD4ABE76-2E9D-49E2-AFD5-2722D410A987}.Release|Any CPU.ActiveCfg = Release|Any CPU
{AD4ABE76-2E9D-49E2-AFD5-2722D410A987}.Release|Any CPU.Build.0 = Release|Any CPU
{D25CF673-216B-450C-840A-039ECF088CB7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D25CF673-216B-450C-840A-039ECF088CB7}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D25CF673-216B-450C-840A-039ECF088CB7}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D25CF673-216B-450C-840A-039ECF088CB7}.Release|Any CPU.Build.0 = Release|Any CPU
{6BCE1270-464D-42CB-B07E-1B0A88A70D6F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6BCE1270-464D-42CB-B07E-1B0A88A70D6F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6BCE1270-464D-42CB-B07E-1B0A88A70D6F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6BCE1270-464D-42CB-B07E-1B0A88A70D6F}.Release|Any CPU.Build.0 = Release|Any CPU
{E2CC1CB0-7895-4A50-B62A-20F313A4C3B0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E2CC1CB0-7895-4A50-B62A-20F313A4C3B0}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E2CC1CB0-7895-4A50-B62A-20F313A4C3B0}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E2CC1CB0-7895-4A50-B62A-20F313A4C3B0}.Release|Any CPU.Build.0 = Release|Any CPU
{AE26BC29-2929-4A96-9789-1039D7806D98}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{AE26BC29-2929-4A96-9789-1039D7806D98}.Debug|Any CPU.Build.0 = Debug|Any CPU
{AE26BC29-2929-4A96-9789-1039D7806D98}.Release|Any CPU.ActiveCfg = Release|Any CPU
{AE26BC29-2929-4A96-9789-1039D7806D98}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{40EC45C4-0325-4851-AB1C-64B27ED28BAD} = {7D1B20B1-5314-4746-B6D4-372E0E5B875F}
{D5EBE540-94D0-4E33-A467-C3BDAD5DCB14} = {7D1B20B1-5314-4746-B6D4-372E0E5B875F}
{60A6B771-3B8B-4CF7-81F7-E8D1A20E22CC} = {7D1B20B1-5314-4746-B6D4-372E0E5B875F}
{AD4ABE76-2E9D-49E2-AFD5-2722D410A987} = {78471569-A5AA-4473-9F70-74B75B4E899C}
{D25CF673-216B-450C-840A-039ECF088CB7} = {E8259067-6649-4246-9DE8-7837F8163F68}
{6BCE1270-464D-42CB-B07E-1B0A88A70D6F} = {E8259067-6649-4246-9DE8-7837F8163F68}
{E2CC1CB0-7895-4A50-B62A-20F313A4C3B0} = {E8259067-6649-4246-9DE8-7837F8163F68}
{AE26BC29-2929-4A96-9789-1039D7806D98} = {E32C4F1E-0DB6-4171-BA5E-F61276E37081}
{B530EC0C-92A5-445F-8938-DBCD083DCF19} = {2D94959E-539E-43A8-B50D-435D969059FF}
{D1DC0BB5-C429-4192-BF01-EF58D6B0F9AB} = {B530EC0C-92A5-445F-8938-DBCD083DCF19}
{E83B541E-8621-47EA-8227-A36A196A66E0} = {B530EC0C-92A5-445F-8938-DBCD083DCF19}
{E6C5099B-43B2-480E-8AD7-CBE18D807E92} = {713AD7B2-EB14-40B5-A49F-6447C3F5254A}
{CDB0B36B-D97F-44B9-AB7C-13CAB544312A} = {713AD7B2-EB14-40B5-A49F-6447C3F5254A}
{7D1B20B1-5314-4746-B6D4-372E0E5B875F} = {1ED5A035-825C-40C9-95F9-F0E275F3187A}
{C445A0CF-5BB5-4D81-BB70-04A0AA098167} = {1ED5A035-825C-40C9-95F9-F0E275F3187A}
{78471569-A5AA-4473-9F70-74B75B4E899C} = {C445A0CF-5BB5-4D81-BB70-04A0AA098167}
{E8259067-6649-4246-9DE8-7837F8163F68} = {2D94959E-539E-43A8-B50D-435D969059FF}
{F7A7A3A5-1B08-419A-8B69-A6874B97E06D} = {2D94959E-539E-43A8-B50D-435D969059FF}
{E32C4F1E-0DB6-4171-BA5E-F61276E37081} = {F7A7A3A5-1B08-419A-8B69-A6874B97E06D}
{23674AB6-9EF1-4400-9F0A-048CE74EB1BB} = {1ED5A035-825C-40C9-95F9-F0E275F3187A}
{282D0B3E-D1F9-45B6-8CE2-D055F6479672} = {2D94959E-539E-43A8-B50D-435D969059FF}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {98497725-4038-46B9-910E-2BADC6FDC7E4}
EndGlobalSection
EndGlobal
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
/// ********************************************************************************************************
///
/// Morgan Stanley makes this available to you under the Apache License, Version 2.0 (the "License").
/// You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.
/// See the NOTICE file distributed with this work for additional information regarding copyright ownership.
/// Unless required by applicable law or agreed to in writing, software distributed under the License
/// is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
/// See the License for the specific language governing permissions and limitations under the License.
///
/// ********************************************************************************************************

using Avalonia;
using System;

namespace MorganStanley.ComposeUI.Prototypes.NoPluginsPrototype
{
internal class Program
{
// Initialization code. Don't use any Avalonia, third-party APIs or any
// SynchronizationContext-reliant code before AppMain is called: things aren't initialized
// yet and stuff might break.
[STAThread]
public static void Main(string[] args) => BuildAvaloniaApp()
.StartWithClassicDesktopLifetime(args);

// Avalonia configuration, don't remove; also used by visual designer.
public static AppBuilder BuildAvaloniaApp()
=> AppBuilder.Configure<App>()
.UsePlatformDetect()
.LogToTrace();
}
}
Loading

0 comments on commit 29ee51d

Please sign in to comment.