Index: Core/Common/src/Core.Common.Gui/Forms/ViewHost/DocumentViewController.cs =================================================================== diff -u -rb1b4dd578cdb715c2461f0b451da8eaac3add6b3 -r7f997e6d093cb208c943e8e4b1bad52802cc551f --- Core/Common/src/Core.Common.Gui/Forms/ViewHost/DocumentViewController.cs (.../DocumentViewController.cs) (revision b1b4dd578cdb715c2461f0b451da8eaac3add6b3) +++ Core/Common/src/Core.Common.Gui/Forms/ViewHost/DocumentViewController.cs (.../DocumentViewController.cs) (revision 7f997e6d093cb208c943e8e4b1bad52802cc551f) @@ -38,7 +38,7 @@ private readonly ViewInfo[] viewInfos; private readonly IWin32Window dialogParent; - private readonly IDictionary openedViewLookup = new Dictionary(); + private readonly IDictionary> openedViewLookup = new Dictionary>(); /// /// Initializes a new instance of the class. @@ -143,21 +143,21 @@ private void CreateViewFromViewInfo(object data, ViewInfo viewInfo) { - IView view; + Tuple view; openedViewLookup.TryGetValue(data, out view); if (view != null) { - viewHost.BringToFront(view); + viewHost.BringToFront(view.Item1); return; } - view = CreateViewForData(data, viewInfo); + view = new Tuple(CreateViewForData(data, viewInfo), viewInfo); openedViewLookup.Add(data, view); - viewHost.AddDocumentView(view); - viewHost.SetImage(view, viewInfo.Image); + viewHost.AddDocumentView(view.Item1); + viewHost.SetImage(view.Item1, viewInfo.Image); } private static IView CreateViewForData(object data, ViewInfo viewInfo) @@ -175,7 +175,7 @@ private bool ShouldRemoveViewForData(IView view, object data) { - ViewInfo viewInfo = viewInfos.FirstOrDefault(vi => vi.ViewType == view.GetType()); + ViewInfo viewInfo = openedViewLookup.Single(openedView => ReferenceEquals(view, openedView.Value.Item1)).Value.Item2; if (viewInfo == null) { @@ -190,7 +190,7 @@ private void ViewHostOnViewClosed(object sender, ViewChangeEventArgs viewChangeEventArgs) { - object data = openedViewLookup.Where(kv => ReferenceEquals(kv.Value, viewChangeEventArgs.View)) + object data = openedViewLookup.Where(kv => ReferenceEquals(kv.Value.Item1, viewChangeEventArgs.View)) .Select(kv => kv.Key) .FirstOrDefault(); Index: Core/Common/test/Core.Common.Gui.Test/Forms/ViewHost/DocumentViewControllerTest.cs =================================================================== diff -u -rc51ba92268d9a8272778e758fd0f9a71a0d61849 -r7f997e6d093cb208c943e8e4b1bad52802cc551f --- Core/Common/test/Core.Common.Gui.Test/Forms/ViewHost/DocumentViewControllerTest.cs (.../DocumentViewControllerTest.cs) (revision c51ba92268d9a8272778e758fd0f9a71a0d61849) +++ Core/Common/test/Core.Common.Gui.Test/Forms/ViewHost/DocumentViewControllerTest.cs (.../DocumentViewControllerTest.cs) (revision 7f997e6d093cb208c943e8e4b1bad52802cc551f) @@ -762,7 +762,7 @@ ViewInfo[] matchedViewInfos = documentViewController.GetViewInfosFor(data).ToArray(); // Assert - var expected = new[] + ViewInfo[] expected = { viewInfos[0], viewInfos[2] @@ -807,7 +807,7 @@ ViewInfo[] matchedViewInfos = documentViewController.GetViewInfosFor(data).ToArray(); // Assert - var expected = new[] + ViewInfo[] expected = { viewInfos[0], viewInfos[1] @@ -869,27 +869,16 @@ // Setup var data1 = new A(); var data2 = new InheritedFromA(); - var testView = new TestView - { - Data = data1 - }; - var testViewDerivative = new TestViewDerivative - { - Data = data2 - }; var mocks = new MockRepository(); var dialogParent = mocks.Stub(); var viewHost = mocks.StrictMock(); - + var documentViews = new List(); viewHost.Stub(vh => vh.ViewClosed += null).IgnoreArguments(); viewHost.Stub(vh => vh.ViewClosed -= null).IgnoreArguments(); - viewHost.Stub(vh => vh.DocumentViews).Return(new[] - { - testView, - testViewDerivative - }); - + viewHost.Stub(vh => vh.DocumentViews).Return(documentViews); + viewHost.Expect(vm => vm.AddDocumentView(Arg.Is.NotNull)).WhenCalled(invocation => { documentViews.Add(invocation.Arguments[0] as TestView); }).Repeat.Twice(); + viewHost.Expect(vh => vh.SetImage(null, null)).IgnoreArguments().Repeat.Twice(); mocks.ReplayAll(); var viewInfos = new ViewInfo[] @@ -900,6 +889,9 @@ using (var documentViewController = new DocumentViewController(viewHost, viewInfos, dialogParent)) { + documentViewController.OpenViewForData(data1); + documentViewController.OpenViewForData(data2); + // Call documentViewController.CloseAllViewsFor(new object()); } @@ -914,28 +906,18 @@ // Setup var data1 = new A(); var data2 = new InheritedFromA(); - var testView = new TestView - { - Data = data1 - }; - var testViewDerivative = new TestViewDerivative - { - Data = data2 - }; var mocks = new MockRepository(); var dialogParent = mocks.Stub(); var viewHost = mocks.StrictMock(); - var documentViews = new List - { - testView, - testViewDerivative - }; + var documentViews = new List(); viewHost.Stub(vh => vh.ViewClosed += null).IgnoreArguments(); viewHost.Stub(vh => vh.ViewClosed -= null).IgnoreArguments(); viewHost.Stub(vh => vh.DocumentViews).Return(documentViews); - viewHost.Expect(vh => vh.Remove(testView)).WhenCalled(x => documentViews.Remove(testView)); + viewHost.Expect(vm => vm.AddDocumentView(Arg.Is.NotNull)).WhenCalled(invocation => { documentViews.Add(invocation.Arguments[0] as TestView); }).Repeat.Twice(); + viewHost.Expect(vh => vh.SetImage(null, null)).IgnoreArguments().Repeat.Twice(); + viewHost.Expect(vh => vh.Remove(Arg.Is.NotNull)).WhenCalled(invocation => { documentViews.Remove(invocation.Arguments[0] as TestView); }); mocks.ReplayAll(); @@ -947,6 +929,9 @@ using (var documentViewController = new DocumentViewController(viewHost, viewInfos, dialogParent)) { + documentViewController.OpenViewForData(data1); + documentViewController.OpenViewForData(data2); + // Call documentViewController.CloseAllViewsFor(data1); } @@ -962,30 +947,18 @@ var data1 = new A(); var data2 = new InheritedFromA(); var unusedViewData = new object(); - var testView = new TestView - { - Data = data1 - }; - var testViewDerivative = new TestViewDerivative - { - Data = data2 - }; var mocks = new MockRepository(); var dialogParent = mocks.Stub(); var viewHost = mocks.StrictMock(); - var documentViews = new List - { - testView, - testViewDerivative - }; + var documentViews = new List(); viewHost.Stub(vh => vh.ViewClosed += null).IgnoreArguments(); viewHost.Stub(vh => vh.ViewClosed -= null).IgnoreArguments(); viewHost.Stub(vh => vh.DocumentViews).Return(documentViews); - viewHost.Expect(vh => vh.Remove(testView)).WhenCalled(x => documentViews.Remove(testView)); - viewHost.Expect(vh => vh.Remove(testViewDerivative)).WhenCalled(x => documentViews.Remove(testViewDerivative)); - + viewHost.Expect(vm => vm.AddDocumentView(Arg.Is.NotNull)).WhenCalled(invocation => { documentViews.Add(invocation.Arguments[0] as TestView); }).Repeat.Twice(); + viewHost.Expect(vh => vh.SetImage(null, null)).IgnoreArguments().Repeat.Twice(); + viewHost.Expect(vh => vh.Remove(Arg.Is.NotNull)).WhenCalled(invocation => { documentViews.Remove(invocation.Arguments[0] as TestView); }).Repeat.Twice(); mocks.ReplayAll(); var viewInfos = new ViewInfo[] @@ -1014,6 +987,9 @@ using (var documentViewController = new DocumentViewController(viewHost, viewInfos, dialogParent)) { + documentViewController.OpenViewForData(data1); + documentViewController.OpenViewForData(data2); + // Call documentViewController.CloseAllViewsFor(unusedViewData); }