Skip to content

Commit ab606c9

Browse files
authored
Reduce MoBi startup time (#2431)
* Defer the journal page editor to first use to speed up startup The Journal Editor menu button eagerly resolved its command at startup, constructing the DevExpress rich-edit editor. Resolve the command on click, and create the editor on the first EditJournalPageStartedEvent via JournalPageEditorActivator. * Update OSPSuite.* to 13.0.132 Pulls in the on-demand skin gallery (OSPSuite.Core#2902), removing the skin-gallery construction from startup. * Mark the journal editor activated only after it resolves successfully If the editor fails to construct, keep the activator subscribed and un-activated so the next edit retries instead of silently disabling journal editing.
1 parent 92111b8 commit ab606c9

17 files changed

Lines changed: 172 additions & 43 deletions

File tree

src/MoBi.Assets/MoBi.Assets.csproj

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@
2222
</ItemGroup>
2323

2424
<ItemGroup>
25-
<PackageReference Include="OSPSuite.Assets" Version="13.0.131" />
26-
<PackageReference Include="OSPSuite.Assets.Images" Version="13.0.131" />
27-
<PackageReference Include="OSPSuite.Core" Version="13.0.131" />
25+
<PackageReference Include="OSPSuite.Assets" Version="13.0.132" />
26+
<PackageReference Include="OSPSuite.Assets.Images" Version="13.0.132" />
27+
<PackageReference Include="OSPSuite.Core" Version="13.0.132" />
2828
</ItemGroup>
2929

3030
<ItemGroup>

src/MoBi.BatchTool/MoBi.BatchTool.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
</ItemGroup>
4141
<ItemGroup>
4242
<PackageReference Include="DevExpress.Win.Design" Version="25.2.7" Condition="'$(ExcludeDesigner)' != 'true'" />
43-
<PackageReference Include="OSPSuite.Core" Version="13.0.131" />
43+
<PackageReference Include="OSPSuite.Core" Version="13.0.132" />
4444
<PackageReference Include="OSPSuite.FuncParser" Version="5.0.0.3" />
4545
<PackageReference Include="OSPSuite.SimModel" Version="5.0.0.76" />
4646
<PackageReference Include="OSPSuite.SimModelSolver_CVODES" Version="5.0.0.53" />

src/MoBi.CLI.Core/MoBi.CLI.Core.csproj

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,13 @@
1616

1717

1818
<ItemGroup>
19-
<PackageReference Include="OSPSuite.Assets" Version="13.0.131" />
20-
<PackageReference Include="OSPSuite.Infrastructure.Autofac" Version="13.0.131" />
19+
<PackageReference Include="OSPSuite.Assets" Version="13.0.132" />
20+
<PackageReference Include="OSPSuite.Infrastructure.Autofac" Version="13.0.132" />
2121
<PackageReference Include="OSPSuite.Utility" Version="5.0.0.10" />
22-
<PackageReference Include="OSPSuite.Core" Version="13.0.131" />
23-
<PackageReference Include="OSPSuite.R" Version="13.0.131" />
24-
<PackageReference Include="OSPSuite.Infrastructure" Version="13.0.131" />
25-
<PackageReference Include="OSPSuite.Infrastructure.Castle" Version="13.0.131" />
22+
<PackageReference Include="OSPSuite.Core" Version="13.0.132" />
23+
<PackageReference Include="OSPSuite.R" Version="13.0.132" />
24+
<PackageReference Include="OSPSuite.Infrastructure" Version="13.0.132" />
25+
<PackageReference Include="OSPSuite.Infrastructure.Castle" Version="13.0.132" />
2626
</ItemGroup>
2727
<ItemGroup>
2828
<ProjectReference Include="..\MoBi.Assets\MoBi.Assets.csproj" />

src/MoBi.CLI/MoBi.CLI.csproj

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,15 @@
2121
<ItemGroup>
2222
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="9.0.6" />
2323
<PackageReference Include="CommandLineParser" Version="2.9.1" />
24-
<PackageReference Include="OSPSuite.Core" Version="13.0.131" />
25-
<PackageReference Include="OSPSuite.Assets" Version="13.0.131" />
24+
<PackageReference Include="OSPSuite.Core" Version="13.0.132" />
25+
<PackageReference Include="OSPSuite.Assets" Version="13.0.132" />
2626
<PackageReference Include="OSPSuite.Utility" Version="5.0.0.10" />
2727
<PackageReference Include="OSPSuite.FuncParser" Version="5.0.0.3" />
2828
<PackageReference Include="OSPSuite.SimModel" Version="5.0.0.76" />
2929
<PackageReference Include="OSPSuite.SimModelSolver_CVODES" Version="5.0.0.53" />
3030
<PackageReference Include="SixLabors.ImageSharp" Version="2.1.11" />
31-
<PackageReference Include="OSPSuite.Infrastructure" Version="13.0.131" />
32-
<PackageReference Include="OSPSuite.Infrastructure.Castle" Version="13.0.131" />
31+
<PackageReference Include="OSPSuite.Infrastructure" Version="13.0.132" />
32+
<PackageReference Include="OSPSuite.Infrastructure.Castle" Version="13.0.132" />
3333
</ItemGroup>
3434
<ItemGroup>
3535
<Content Include="..\..\dimensions\OSPSuite.Dimensions.xml" Link="OSPSuite.Dimensions.xml">

src/MoBi.Core/MoBi.Core.csproj

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,12 @@
3131
<PackageReference Include="NHibernate.Extensions.Sqlite" Version="10.0.1" />
3232
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
3333
<PackageReference Include="OSPSuite.Utility" Version="5.0.0.10" />
34-
<PackageReference Include="OSPSuite.Core" Version="13.0.131" />
35-
<PackageReference Include="OSPSuite.Assets" Version="13.0.131" />
36-
<PackageReference Include="OSPSuite.Assets.Images" Version="13.0.131" />
37-
<PackageReference Include="OSPSuite.Infrastructure.Export" Version="13.0.131" />
38-
<PackageReference Include="OSPSuite.Infrastructure.Serialization" Version="13.0.131" />
39-
<PackageReference Include="OSPSuite.Infrastructure.Import" Version="13.0.131" />
34+
<PackageReference Include="OSPSuite.Core" Version="13.0.132" />
35+
<PackageReference Include="OSPSuite.Assets" Version="13.0.132" />
36+
<PackageReference Include="OSPSuite.Assets.Images" Version="13.0.132" />
37+
<PackageReference Include="OSPSuite.Infrastructure.Export" Version="13.0.132" />
38+
<PackageReference Include="OSPSuite.Infrastructure.Serialization" Version="13.0.132" />
39+
<PackageReference Include="OSPSuite.Infrastructure.Import" Version="13.0.132" />
4040
<PackageReference Include="Microsoft.Data.Sqlite" Version="10.0.7" />
4141
<PackageReference Include="SQLitePCLRaw.bundle_e_sqlite3" Version="3.0.3" />
4242
</ItemGroup>

src/MoBi.Engine/MoBi.Engine.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@
2828
</ItemGroup>
2929

3030
<ItemGroup>
31-
<PackageReference Include="OSPSuite.Core" Version="13.0.131" />
32-
<PackageReference Include="OSPSuite.Assets" Version="13.0.131" />
31+
<PackageReference Include="OSPSuite.Core" Version="13.0.132" />
32+
<PackageReference Include="OSPSuite.Assets" Version="13.0.132" />
3333
</ItemGroup>
3434

3535
<ItemGroup>
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
using OSPSuite.Core.Journal;
2+
using OSPSuite.Presentation.Presenters.Journal;
3+
using OSPSuite.Utility.Container;
4+
using OSPSuite.Utility.Events;
5+
6+
namespace MoBi.Presentation.Core
7+
{
8+
public interface IJournalPageEditorActivator : IListener<EditJournalPageStartedEvent>
9+
{
10+
}
11+
12+
/// <summary>
13+
/// Creates the journal page editor on first use because it constructs expensive DevExpress components.
14+
/// </summary>
15+
public class JournalPageEditorActivator : IJournalPageEditorActivator
16+
{
17+
private readonly IContainer _container;
18+
private readonly IEventPublisher _eventPublisher;
19+
private bool _activated;
20+
21+
public JournalPageEditorActivator(IContainer container, IEventPublisher eventPublisher)
22+
{
23+
_container = container;
24+
_eventPublisher = eventPublisher;
25+
}
26+
27+
public void Handle(EditJournalPageStartedEvent eventToHandle)
28+
{
29+
if (_activated) return;
30+
31+
_container.Resolve<IJournalPageEditorFormPresenter>();
32+
//set only after a successful resolve (so a failed resolve retries on the next edit), but before
33+
//re-publishing so the re-dispatched event does not re-enter this activator
34+
_activated = true;
35+
//re-publish because the presenters created above were not yet subscribed when this event was published
36+
_eventPublisher.PublishEvent(eventToHandle);
37+
_eventPublisher.RemoveListener(this);
38+
}
39+
}
40+
}

src/MoBi.Presentation/MoBi.Presentation.csproj

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,9 @@
2121
<ItemGroup>
2222
<PackageReference Include="OSPSuite.TeXReporting" Version="3.0.1.3" />
2323
<PackageReference Include="OSPSuite.Utility" Version="5.0.0.10" />
24-
<PackageReference Include="OSPSuite.Presentation" Version="13.0.131" />
25-
<PackageReference Include="OSPSuite.Presentation.Serialization" Version="13.0.131" />
26-
<PackageReference Include="OSPSuite.Core" Version="13.0.131" />
24+
<PackageReference Include="OSPSuite.Presentation" Version="13.0.132" />
25+
<PackageReference Include="OSPSuite.Presentation.Serialization" Version="13.0.132" />
26+
<PackageReference Include="OSPSuite.Core" Version="13.0.132" />
2727
</ItemGroup>
2828
<ItemGroup>
2929
<None Include="..\..\LICENSE">

src/MoBi.Presentation/PresentationRegister.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ public override void RegisterInContainer(IContainer container)
8282
scan.ExcludeType<MoBiApplicationController>();
8383
scan.ExcludeType<MoBiXmlSerializerRepository>();
8484
scan.ExcludeType<MoBiMainViewPresenter>();
85+
scan.ExcludeType<JournalPageEditorActivator>();
8586
scan.Exclude(t => t.IsAnImplementationOf<IMoBiBaseDiagramPresenter>());
8687

8788
//exclude presenter already registered at startup
@@ -92,6 +93,7 @@ public override void RegisterInContainer(IContainer container)
9293

9394
container.Register<IPKSimStarter, IPKSimSnapshotConverter, PKSimStarter>(LifeStyle.Singleton);
9495
container.Register<IMenuBarItemRepository, MenuBarItemRepository>(LifeStyle.Singleton);
96+
container.Register<IJournalPageEditorActivator, JournalPageEditorActivator>(LifeStyle.Singleton);
9597
container.Register<ISimulationRunner, SimulationRunner>(LifeStyle.Singleton);
9698
container.Register<IMoBiApplicationController, IApplicationController, MoBiApplicationController>(LifeStyle.Singleton);
9799

@@ -128,6 +130,8 @@ public override void RegisterInContainer(IContainer container)
128130
//Create one instance of the invoker so that the object is available
129131
//since it is not created anywhere and is only used as event listener
130132
container.RegisterImplementationOf(container.Resolve<ICloseSubjectPresenterInvoker>());
133+
//Activates the journal page editor on first use
134+
container.Resolve<IJournalPageEditorActivator>();
131135
container.Register<IWithWorkspaceLayout, Workspace>(LifeStyle.Singleton);
132136

133137
container.Register<IQuantityPathToQuantityDisplayPathMapper, MoBiQuantityPathToQuantityDisplayPathMapper>();

src/MoBi.Presentation/Repositories/MenuBarItemRepository.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -501,7 +501,13 @@ protected override IEnumerable<IMenuBarItem> AllMenuBarItems()
501501
yield return JournalMenuBarButtons.JournalView(MenuBarItemIds.JournalView, _container);
502502
yield return JournalMenuBarButtons.CreateJournalPage(MenuBarItemIds.CreateJournalPage, _container);
503503
yield return JournalMenuBarButtons.SelectJournal(MenuBarItemIds.SelectJournal, _container);
504-
yield return JournalMenuBarButtons.JournalEditorView(MenuBarItemIds.JournalEditorView, _container);
504+
//Initialize JournalEditorVisibiliyUICommand on demand because it constructs expensive DevExpress components
505+
yield return CreateMenuButton.WithCaption(OSPSuite.Assets.Captions.Journal.JournalEditorView)
506+
.WithId(MenuBarItemIds.JournalEditorView)
507+
.WithDescription(OSPSuite.Assets.Captions.Journal.JournalEditorViewDescription)
508+
.WithActionCommand(() => _container.Resolve<JournalEditorVisibiliyUICommand>().Execute())
509+
.WithIcon(ApplicationIcons.PageEdit);
510+
505511
yield return CommonMenuBarButtons.JournalDiagramView(MenuBarItemIds.JournalDiagramView, _container);
506512
yield return JournalMenuBarButtons.SearchJournal(MenuBarItemIds.SearchJournal, _container);
507513
yield return JournalMenuBarButtons.ExportJournal(MenuBarItemIds.ExportJournal, _container);

0 commit comments

Comments
 (0)