Index: Core/Common/src/Core.Common.Base/Core.Common.Base.csproj =================================================================== diff -u -r1b4f4720632f9a691837fa97e777a4637b6739c8 -r0dbf681489bfe1d279eef99030f9ee13abebbb23 --- Core/Common/src/Core.Common.Base/Core.Common.Base.csproj (.../Core.Common.Base.csproj) (revision 1b4f4720632f9a691837fa97e777a4637b6739c8) +++ Core/Common/src/Core.Common.Base/Core.Common.Base.csproj (.../Core.Common.Base.csproj) (revision 0dbf681489bfe1d279eef99030f9ee13abebbb23) @@ -97,6 +97,7 @@ + Index: Core/Common/src/Core.Common.Base/Observer.cs =================================================================== diff -u --- Core/Common/src/Core.Common.Base/Observer.cs (revision 0) +++ Core/Common/src/Core.Common.Base/Observer.cs (revision 0dbf681489bfe1d279eef99030f9ee13abebbb23) @@ -0,0 +1,84 @@ +// Copyright (C) Stichting Deltares 2016. All rights reserved. +// +// This file is part of Ringtoets. +// +// Ringtoets is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with this program. If not, see . +// +// All names, logos, and references to "Deltares" are registered trademarks of +// Stichting Deltares and remain full property of Stichting Deltares at all times. +// All rights reserved. + +using System; + +namespace Core.Common.Base +{ + /// + /// Class that implements the pattern. + /// + /// + /// The being observed by instances of this class can be dynamically changed. + /// + public class Observer : IObserver, IDisposable + { + private readonly Action updateObserverAction; + private IObservable observable; + + /// + /// Creates a new instance of the class. + /// + /// The action to perform on notifications coming from . + public Observer(Action updateObserverAction) + { + this.updateObserverAction = updateObserverAction; + } + + /// + /// Gets or sets the object to observe. + /// + public IObservable Observable + { + get + { + return observable; + } + set + { + if (observable != null) + { + observable.Detach(this); + } + + observable = value; + + if (observable != null) + { + observable.Attach(this); + } + } + } + + public void UpdateObserver() + { + updateObserverAction(); + } + + public void Dispose() + { + if (observable != null) + { + observable.Detach(this); + } + } + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.Base.Test/Core.Common.Base.Test.csproj =================================================================== diff -u -r1b4f4720632f9a691837fa97e777a4637b6739c8 -r0dbf681489bfe1d279eef99030f9ee13abebbb23 --- Core/Common/test/Core.Common.Base.Test/Core.Common.Base.Test.csproj (.../Core.Common.Base.Test.csproj) (revision 1b4f4720632f9a691837fa97e777a4637b6739c8) +++ Core/Common/test/Core.Common.Base.Test/Core.Common.Base.Test.csproj (.../Core.Common.Base.Test.csproj) (revision 0dbf681489bfe1d279eef99030f9ee13abebbb23) @@ -91,6 +91,7 @@ + Index: Core/Common/test/Core.Common.Base.Test/ObserverTest.cs =================================================================== diff -u --- Core/Common/test/Core.Common.Base.Test/ObserverTest.cs (revision 0) +++ Core/Common/test/Core.Common.Base.Test/ObserverTest.cs (revision 0dbf681489bfe1d279eef99030f9ee13abebbb23) @@ -0,0 +1,103 @@ +// Copyright (C) Stichting Deltares 2016. All rights reserved. +// +// This file is part of Ringtoets. +// +// Ringtoets is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with this program. If not, see . +// +// All names, logos, and references to "Deltares" are registered trademarks of +// Stichting Deltares and remain full property of Stichting Deltares at all times. +// All rights reserved. + +using NUnit.Framework; + +namespace Core.Common.Base.Test +{ + [TestFixture] + public class ObserverTest + { + [Test] + public void DefaultConstructor_DefaultValues() + { + // Call + var observer = new Observer(() => { }); + + // Assert + Assert.IsInstanceOf(observer); + Assert.IsNull(observer.Observable); + } + + [Test] + public void Observer_WithObservable_NotifyObserversResultsInPerformingUpdateObserversAction() + { + // Setup + var counter = 0; + var observable = new TestObservable(); + var observer = new Observer(() => counter++) + { + Observable = observable + }; + + // Call + observable.NotifyObservers(); + + // Assert + Assert.AreEqual(1, counter); + } + + [Test] + public void Observer_WithObservableSetAndThenUnset_NotifyObserversNoLongerResultsInPerformingUpdateObserversAction() + { + // Setup + var counter = 0; + var observable = new TestObservable(); + var observer = new Observer(() => counter++) + { + Observable = observable + }; + + observer.Observable = null; + + // Call + observable.NotifyObservers(); + + // Assert + Assert.AreEqual(0, counter); + } + + [Test] + public void Observer_WithObservableSetAndThenDisposed_NotifyObserversNoLongerResultsInPerformingUpdateObserversAction() + { + // Setup + var counter = 0; + var observable = new TestObservable(); + var observer = new Observer(() => counter++) + { + Observable = observable + }; + + observer.Dispose(); + + // Call + observable.NotifyObservers(); + + // Assert + Assert.AreEqual(0, counter); + } + + private class TestObservable : Observable + { + + } + } +} Index: Ringtoets/Piping/src/Ringtoets.Piping.Forms/Views/PipingCalculationsView.cs =================================================================== diff -u -r13919719112d513d5782320d8c0829c69b5e8d9e -r0dbf681489bfe1d279eef99030f9ee13abebbb23 --- Ringtoets/Piping/src/Ringtoets.Piping.Forms/Views/PipingCalculationsView.cs (.../PipingCalculationsView.cs) (revision 13919719112d513d5782320d8c0829c69b5e8d9e) +++ Ringtoets/Piping/src/Ringtoets.Piping.Forms/Views/PipingCalculationsView.cs (.../PipingCalculationsView.cs) (revision 0dbf681489bfe1d279eef99030f9ee13abebbb23) @@ -300,44 +300,6 @@ } } - private class Observer : IObserver - { - private readonly Action updateObserverAction; - private IObservable observable; - - public Observer(Action updateObserverAction) - { - this.updateObserverAction = updateObserverAction; - } - - public IObservable Observable - { - get - { - return observable; - } - set - { - if (observable != null) - { - observable.Detach(this); - } - - observable = value; - - if (observable != null) - { - observable.Attach(this); - } - } - } - - public void UpdateObserver() - { - updateObserverAction(); - } - } - private class PipingCalculationRow { private readonly PipingCalculation pipingCalculation;