Skip to content

Commit

Permalink
ILogFileOutlinePlugin's content is displayed in the outline side panel
Browse files Browse the repository at this point in the history
  • Loading branch information
Kittyfisto committed Jul 20, 2019
1 parent e77a900 commit 70ef480
Show file tree
Hide file tree
Showing 7 changed files with 228 additions and 19 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
using Metrolib;
using Moq;
using NUnit.Framework;
using Tailviewer.Archiver.Plugins;
using Tailviewer.BusinessLogic;
using Tailviewer.BusinessLogic.ActionCenter;
using Tailviewer.BusinessLogic.DataSources;
Expand All @@ -27,6 +28,7 @@ namespace Tailviewer.Test.Ui.Controls.MainPanel
[TestFixture]
public sealed class LogViewMainPanelViewModelTest
{
private ServiceContainer _services;
private Mock<IActionCenter> _actionCenter;
private Mock<IApplicationSettings> _settings;
private Mock<IDataSources> _dataSources;
Expand All @@ -36,6 +38,9 @@ public sealed class LogViewMainPanelViewModelTest
[SetUp]
public void Setup()
{
_services = new ServiceContainer();
_services.RegisterInstance<IPluginLoader>(new PluginRegistry());

_actionCenter = new Mock<IActionCenter>();
_dataSources = new Mock<IDataSources>();
_dataSources.Setup(x => x.Sources).Returns(new List<IDataSource>());
Expand All @@ -55,21 +60,21 @@ public void Setup()
[Test]
public void TestConstruction()
{
var model = new LogViewMainPanelViewModel(_actionCenter.Object, _dataSources.Object, _quickFilters.Object, _highlighters.Object, _settings.Object);
var model = new LogViewMainPanelViewModel(_services, _actionCenter.Object, _dataSources.Object, _quickFilters.Object, _highlighters.Object, _settings.Object);
model.Settings.Should().BeSameAs(_settings.Object.LogViewer);
}

[Test]
public void TestUpdate1()
{
var model = new LogViewMainPanelViewModel(_actionCenter.Object, _dataSources.Object, _quickFilters.Object, _highlighters.Object, _settings.Object);
var model = new LogViewMainPanelViewModel(_services, _actionCenter.Object, _dataSources.Object, _quickFilters.Object, _highlighters.Object, _settings.Object);
new Action(() => model.Update()).Should().NotThrow();
}

[Test]
public void TestUpdate2()
{
var model = new LogViewMainPanelViewModel(_actionCenter.Object, _dataSources.Object, _quickFilters.Object, _highlighters.Object, _settings.Object);
var model = new LogViewMainPanelViewModel(_services, _actionCenter.Object, _dataSources.Object, _quickFilters.Object, _highlighters.Object, _settings.Object);
var dataSourceViewModel = new Mock<IDataSourceViewModel>();
var dataSource = new Mock<IDataSource>();
var logFile = new InMemoryLogFile();
Expand Down Expand Up @@ -97,7 +102,7 @@ public void TestUpdate3()
dataSource2.Setup(x => x.UnfilteredLogFile).Returns(new Mock<ILogFile>().Object);

_dataSources.Setup(x => x.Sources).Returns(new List<IDataSource> {dataSource1.Object, dataSource2.Object});
var model = new LogViewMainPanelViewModel(_actionCenter.Object, _dataSources.Object, _quickFilters.Object, _highlighters.Object, _settings.Object);
var model = new LogViewMainPanelViewModel(_services, _actionCenter.Object, _dataSources.Object, _quickFilters.Object, _highlighters.Object, _settings.Object);
model.RecentFiles.Should().HaveCount(2);

dataSource1.Setup(x => x.NoTimestampCount).Returns(42);
Expand All @@ -114,7 +119,7 @@ public void TestUpdate3()
[NUnit.Framework.Description("Verifies that changing an active filter is automatically applied to the currently selected data source")]
public void TestChangeFilter1()
{
var model = new LogViewMainPanelViewModel(_actionCenter.Object, _dataSources.Object, _quickFilters.Object, _highlighters.Object, _settings.Object);
var model = new LogViewMainPanelViewModel(_services, _actionCenter.Object, _dataSources.Object, _quickFilters.Object, _highlighters.Object, _settings.Object);
var dataSourceViewModel = new Mock<IDataSourceViewModel>();
dataSourceViewModel.SetupProperty(x => x.QuickFilterChain);

Expand All @@ -140,7 +145,7 @@ public void TestChangeFilter1()
[Test]
public void TestShowQuickFilters()
{
var model = new LogViewMainPanelViewModel(_actionCenter.Object, _dataSources.Object, _quickFilters.Object, _highlighters.Object, _settings.Object);
var model = new LogViewMainPanelViewModel(_services, _actionCenter.Object, _dataSources.Object, _quickFilters.Object, _highlighters.Object, _settings.Object);
var quickFilterSidePanel = model.SidePanels.OfType<QuickFiltersSidePanelViewModel>().First();
model.SelectedSidePanel.Should().NotBe(quickFilterSidePanel);

Expand All @@ -151,7 +156,7 @@ public void TestShowQuickFilters()
[Test]
public void TestRenameMergedDataSource()
{
var model = new LogViewMainPanelViewModel(_actionCenter.Object, _dataSources.Object, _quickFilters.Object, _highlighters.Object, _settings.Object);
var model = new LogViewMainPanelViewModel(_services, _actionCenter.Object, _dataSources.Object, _quickFilters.Object, _highlighters.Object, _settings.Object);

var dataSourceViewModel = new Mock<IDataSourceViewModel>();
var dataSource = new Mock<IDataSource>();
Expand All @@ -177,7 +182,7 @@ public void TestRenameMergedDataSource()
[Test]
public void TestGoToNextDataSource1()
{
var model = new LogViewMainPanelViewModel(_actionCenter.Object, _dataSources.Object, _quickFilters.Object, _highlighters.Object, _settings.Object);
var model = new LogViewMainPanelViewModel(_services, _actionCenter.Object, _dataSources.Object, _quickFilters.Object, _highlighters.Object, _settings.Object);
model.CurrentDataSource.Should().BeNull();
new Action(() => model.GoToNextDataSource()).Should().NotThrow();
model.CurrentDataSource.Should().BeNull();
Expand All @@ -186,7 +191,7 @@ public void TestGoToNextDataSource1()
[Test]
public void TestGoToPreviousDataSource1()
{
var model = new LogViewMainPanelViewModel(_actionCenter.Object, _dataSources.Object, _quickFilters.Object, _highlighters.Object, _settings.Object);
var model = new LogViewMainPanelViewModel(_services, _actionCenter.Object, _dataSources.Object, _quickFilters.Object, _highlighters.Object, _settings.Object);
model.CurrentDataSource.Should().BeNull();
new Action(() => model.GoToPreviousDataSource()).Should().NotThrow();
model.CurrentDataSource.Should().BeNull();
Expand Down Expand Up @@ -221,7 +226,7 @@ public void TestSelectDataSourcePartOfMergedDataSource()
dataSource2.SetupProperty(x => x.CharacterCode);

_dataSources.Setup(x => x.Sources).Returns(new List<IDataSource> {mergedDataSource.Object, dataSource1.Object, dataSource2.Object});
var model = new LogViewMainPanelViewModel(_actionCenter.Object, _dataSources.Object, _quickFilters.Object, _highlighters.Object, _settings.Object);
var model = new LogViewMainPanelViewModel(_services, _actionCenter.Object, _dataSources.Object, _quickFilters.Object, _highlighters.Object, _settings.Object);
var dataSources = model.SidePanels.OfType<DataSourcesViewModel>().First();

var dataSource1ViewModel = dataSources.DataSources.First(x => x.DataSource == dataSource1.Object);
Expand Down Expand Up @@ -251,7 +256,7 @@ public void TestAddFolder()
source.Setup(x => x.UnfilteredLogFile).Returns(new Mock<ILogFile>().Object);
_dataSources.Setup(x => x.AddFolder(It.IsAny<string>())).Returns(source.Object);

var model = new LogViewMainPanelViewModel(_actionCenter.Object, _dataSources.Object, _quickFilters.Object, _highlighters.Object, _settings.Object);
var model = new LogViewMainPanelViewModel(_services, _actionCenter.Object, _dataSources.Object, _quickFilters.Object, _highlighters.Object, _settings.Object);
var dataSource = model.GetOrAddPath(path);
dataSource.Should().BeOfType<FolderDataSourceViewModel>();
}
Expand Down
1 change: 1 addition & 0 deletions src/Tailviewer/Tailviewer.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -294,6 +294,7 @@
<Compile Include="Ui\Controls\SidePanel\Bookmarks\BookmarkViewModel.cs" />
<Compile Include="Ui\Controls\SidePanel\Highlighters\HighlightersSidePanelViewModel.cs" />
<Compile Include="Ui\Controls\SidePanel\Highlighters\HighlighterViewModel.cs" />
<Compile Include="Ui\Controls\SidePanel\Outline\LogFileOutlineViewModelProxy.cs" />
<Compile Include="Ui\Controls\SidePanel\Outline\OutlineViewModel.cs" />
<Compile Include="Ui\ViewModels\FolderDataSourceViewModel.cs" />
<Compile Include="Ui\Controls\SidePanel\HyperlinkRun.cs" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@
using Tailviewer.Ui.Controls.SidePanel.Bookmarks;
using Tailviewer.Ui.Controls.SidePanel.DataSources;
using Tailviewer.Ui.Controls.SidePanel.Highlighters;
using Tailviewer.Ui.Controls.SidePanel.Outline;
using Tailviewer.Ui.Controls.SidePanel.QuickFilters;
using Tailviewer.Ui.Controls.SidePanel.Synopsis;
using Tailviewer.Ui.ViewModels;

namespace Tailviewer.Ui.Controls.MainPanel
Expand Down Expand Up @@ -49,7 +49,8 @@ public sealed class LogViewMainPanelViewModel
private string _windowTitleSuffix;
private bool _showQuickNavigation;

public LogViewMainPanelViewModel(IActionCenter actionCenter,
public LogViewMainPanelViewModel(IServiceContainer services,
IActionCenter actionCenter,
IDataSources dataSources,
IQuickFilters quickFilters,
IHighlighters highlighters,
Expand All @@ -76,7 +77,7 @@ public sealed class LogViewMainPanelViewModel
_quickNavigation.DataSourceChosen += QuickNavigationOnDataSourceChosen;

_bookmarks = new BookmarksViewModel(dataSources, OnNavigateToBookmark);
_outline = new OutlineViewModel();
_outline = new OutlineViewModel(services);

_sidePanels = new ISidePanelViewModel[]
{
Expand Down Expand Up @@ -165,6 +166,7 @@ private void ChangeDataSource(IDataSourceViewModel value)
_dataSources.SelectedItem = value;
_quickFilters.CurrentDataSource = value;
_bookmarks.CurrentDataSource = value?.DataSource;
_outline.CurrentDataSource = value?.DataSource;
OpenFile(value);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
using System;
using System.ComponentModel;
using System.Reflection;
using System.Windows;
using log4net;
using Tailviewer.BusinessLogic.LogFiles;
using Tailviewer.Ui.Outline;

namespace Tailviewer.Ui.Controls.SidePanel.Outline
{
/// <summary>
/// Responsible for wrapping a <see cref="ILogFileOutlineViewModel" /> and catching all of its unhandled
/// exceptions, if necessary.
/// </summary>
internal sealed class LogFileOutlineViewModelProxy
: ILogFileOutlineViewModel
{
private static readonly ILog Log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
private readonly ILogFileOutlineViewModel _innerViewModel;

private readonly ILogFileOutlinePlugin _plugin;
private readonly IServiceContainer _services;

public LogFileOutlineViewModelProxy(ILogFileOutlinePlugin plugin, IServiceContainer services, ILogFile logFile)
{
_plugin = plugin;
_services = services;
_innerViewModel = TryCreateViewModel(services, plugin, logFile);
}

#region Implementation of INotifyPropertyChanged

#pragma warning disable 67
public event PropertyChangedEventHandler PropertyChanged;
#pragma warning restore 67

#endregion

private static ILogFileOutlineViewModel TryCreateViewModel(IServiceContainer services,
ILogFileOutlinePlugin plugin,
ILogFile logFile)
{
try
{
return plugin.CreateViewModel(services, logFile);
}
catch (Exception e)
{
Log.ErrorFormat("Caught unexpected exception: {0}", e);
return null;
}
}

public FrameworkElement TryCreateContent()
{
if (_innerViewModel == null)
return null;

try
{
return _plugin.CreateContentPresenterFor(_services, _innerViewModel);
}
catch (Exception e)
{
Log.ErrorFormat("Caught unexpected exception: {0}", e);
return null;
}
}

#region Implementation of IDisposable

public void Dispose()
{
try
{
_innerViewModel?.Dispose();
}
catch (Exception e)
{
Log.ErrorFormat("Caught unexpected exception: {0}", e);
}
}

public void Update()
{
try
{
_innerViewModel?.Update();
}
catch (Exception e)
{
Log.ErrorFormat("Caught unexpected exception: {0}", e);
}
}

#endregion
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Tailviewer.Ui.Controls.SidePanel.Synopsis">
xmlns:local="clr-namespace:Tailviewer.Ui.Controls.SidePanel.Outline">

<DataTemplate DataType="{x:Type local:OutlineViewModel}">
<Border Background="White">
Expand All @@ -17,6 +17,9 @@
FontSize="14"
Margin="8,0,0,0" />
</Grid>

<ContentPresenter Grid.Row="1"
Content="{Binding CurrentContent}" />
</Grid>
</Border>
</DataTemplate>
Expand Down

0 comments on commit 70ef480

Please sign in to comment.