Index: Ringtoets/Piping/src/Ringtoets.Piping.Forms/NodePresenters/PipingCalculationGroupContextNodePresenter.cs =================================================================== diff -u -r48b6dd6e6c77ef3075bbeb78858d2300e85cdf68 -r90e159562efbe49fe2c2e348ee04b6a75b4eec13 --- Ringtoets/Piping/src/Ringtoets.Piping.Forms/NodePresenters/PipingCalculationGroupContextNodePresenter.cs (.../PipingCalculationGroupContextNodePresenter.cs) (revision 48b6dd6e6c77ef3075bbeb78858d2300e85cdf68) +++ Ringtoets/Piping/src/Ringtoets.Piping.Forms/NodePresenters/PipingCalculationGroupContextNodePresenter.cs (.../PipingCalculationGroupContextNodePresenter.cs) (revision 90e159562efbe49fe2c2e348ee04b6a75b4eec13) @@ -242,6 +242,14 @@ originalOwnerContext.NotifyObservers(); target.NotifyObservers(); + + ITreeNode draggedNode = TreeView.GetNodeByTag(item); + TreeView.SelectedNode = draggedNode; + ITreeNode newParentOfDraggedNode = draggedNode.Parent; + if (!newParentOfDraggedNode.IsExpanded) + { + newParentOfDraggedNode.Expand(); + } } else { Index: Ringtoets/Piping/src/Ringtoets.Piping.Forms/PresentationObjects/PipingContext.cs =================================================================== diff -u -r495647ee1c652fecc15eea7fefeab29ae01347fe -r90e159562efbe49fe2c2e348ee04b6a75b4eec13 --- Ringtoets/Piping/src/Ringtoets.Piping.Forms/PresentationObjects/PipingContext.cs (.../PipingContext.cs) (revision 495647ee1c652fecc15eea7fefeab29ae01347fe) +++ Ringtoets/Piping/src/Ringtoets.Piping.Forms/PresentationObjects/PipingContext.cs (.../PipingContext.cs) (revision 90e159562efbe49fe2c2e348ee04b6a75b4eec13) @@ -33,6 +33,16 @@ AvailablePipingSoilProfiles = soilProfiles; } + public override bool Equals(object obj) + { + var context = obj as PipingContext; + if (context != null) + { + return WrappedData.Equals(context.WrappedData); + } + return base.Equals(obj); + } + /// /// Gets the available piping surface lines in order for the user to select one to /// set . Index: Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/NodePresenters/PipingCalculationGroupContextNodePresenterTest.cs =================================================================== diff -u -r48b6dd6e6c77ef3075bbeb78858d2300e85cdf68 -r90e159562efbe49fe2c2e348ee04b6a75b4eec13 --- Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/NodePresenters/PipingCalculationGroupContextNodePresenterTest.cs (.../PipingCalculationGroupContextNodePresenterTest.cs) (revision 48b6dd6e6c77ef3075bbeb78858d2300e85cdf68) +++ Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/NodePresenters/PipingCalculationGroupContextNodePresenterTest.cs (.../PipingCalculationGroupContextNodePresenterTest.cs) (revision 90e159562efbe49fe2c2e348ee04b6a75b4eec13) @@ -495,38 +495,60 @@ public void OnDragDrop_DraggingPipingCalculationContextOntoGroup_MoveCalculationInstanceToNewGroup() { // Setup - var originalOwnerObserver = mockRepository.StrictMock(); - originalOwnerObserver.Expect(o => o.UpdateObserver()); - - var newOwnerObserver = mockRepository.StrictMock(); - newOwnerObserver.Expect(o => o.UpdateObserver()); - - var contextMenuBuilderProviderMock = mockRepository.StrictMock(); - - mockRepository.ReplayAll(); - var calculation = new PipingCalculation(); var calculationContext = new PipingCalculationContext(calculation, Enumerable.Empty(), Enumerable.Empty()); var originalOwnerGroup = new PipingCalculationGroup(); originalOwnerGroup.Children.Add(calculation); - originalOwnerGroup.Attach(originalOwnerObserver); var originalOwnerGroupContext = new PipingCalculationGroupContext(originalOwnerGroup, Enumerable.Empty(), Enumerable.Empty()); var newOwnerGroup = new PipingCalculationGroup(); - newOwnerGroup.Attach(newOwnerObserver); var newOwnerGroupContext = new PipingCalculationGroupContext(newOwnerGroup, Enumerable.Empty(), Enumerable.Empty()); + var originalOwnerObserver = mockRepository.StrictMock(); + originalOwnerObserver.Expect(o => o.UpdateObserver()); + + var newOwnerObserver = mockRepository.StrictMock(); + newOwnerObserver.Expect(o => o.UpdateObserver()); + + var originalOwnerGroupContextNode = mockRepository.Stub(); + var newOwnerGroupContextNode = mockRepository.Stub(); + newOwnerGroupContextNode.Expect(n => n.IsExpanded).Return(false); + newOwnerGroupContextNode.Expect(n => n.Expand()); // Must expand new owner, otherwise selecting dragged node could not be visible when parent is collapsed. + + var calculationContextNode = mockRepository.Stub(); + calculationContextNode.Tag = calculationContext; + calculationContextNode.Expect(n => n.Parent).WhenCalled(invocation => + { + // Determine return value based on when it's called: + invocation.ReturnValue = newOwnerGroup.Children.Contains(calculationContext.WrappedData) ? + newOwnerGroupContextNode : + originalOwnerGroupContextNode; + }).Return(null); + + var treeView = mockRepository.Stub(); + treeView.Expect(v => v.GetNodeByTag(calculationContext)).Return(calculationContextNode); + + var contextMenuBuilderProviderMock = mockRepository.StrictMock(); + + mockRepository.ReplayAll(); + + originalOwnerGroup.Attach(originalOwnerObserver); + newOwnerGroup.Attach(newOwnerObserver); + // Precondition: CollectionAssert.Contains(originalOwnerGroup.Children, calculation); CollectionAssert.DoesNotContain(newOwnerGroup.Children, calculation); - var nodePresenter = new PipingCalculationGroupContextNodePresenter(contextMenuBuilderProviderMock); + var nodePresenter = new PipingCalculationGroupContextNodePresenter(contextMenuBuilderProviderMock) + { + TreeView = treeView + }; // Call nodePresenter.OnDragDrop(calculationContext, originalOwnerGroupContext, newOwnerGroupContext, DragOperations.Move, int.MaxValue); @@ -535,45 +557,70 @@ CollectionAssert.DoesNotContain(originalOwnerGroup.Children, calculation); CollectionAssert.Contains(newOwnerGroup.Children, calculation); Assert.AreSame(calculation, newOwnerGroup.Children.Last()); + + Assert.AreSame(calculationContextNode, treeView.SelectedNode); + mockRepository.VerifyAll(); } [Test] public void OnDragDrop_DraggingPipingCalculationGroupContextOntoGroup_MoveGroupInstanceToNewGroup() { // Setup - var originalOwnerObserver = mockRepository.StrictMock(); - originalOwnerObserver.Expect(o => o.UpdateObserver()); - - var newOwnerObserver = mockRepository.StrictMock(); - newOwnerObserver.Expect(o => o.UpdateObserver()); - - var contextMenuBuilderProviderMock = mockRepository.StrictMock(); - - mockRepository.ReplayAll(); - var group = new PipingCalculationGroup(); var groupContext = new PipingCalculationGroupContext(group, Enumerable.Empty(), Enumerable.Empty()); var originalOwnerGroup = new PipingCalculationGroup(); originalOwnerGroup.Children.Add(group); - originalOwnerGroup.Attach(originalOwnerObserver); var originalOwnerGroupContext = new PipingCalculationGroupContext(originalOwnerGroup, Enumerable.Empty(), Enumerable.Empty()); var newOwnerGroup = new PipingCalculationGroup(); - newOwnerGroup.Attach(newOwnerObserver); var newOwnerGroupContext = new PipingCalculationGroupContext(newOwnerGroup, Enumerable.Empty(), Enumerable.Empty()); + var originalOwnerObserver = mockRepository.StrictMock(); + originalOwnerObserver.Expect(o => o.UpdateObserver()); + + var newOwnerObserver = mockRepository.StrictMock(); + newOwnerObserver.Expect(o => o.UpdateObserver()); + + var originalOwnerGroupContextNode = mockRepository.Stub(); + var newOwnerGroupContextNode = mockRepository.Stub(); + newOwnerGroupContextNode.Expect(n => n.IsExpanded).Return(false); + newOwnerGroupContextNode.Expect(n => n.Expand()); // Must expand new owner, otherwise selecting dragged node could not be visible when parent is collapsed. + + var groupContextNode = mockRepository.Stub(); + groupContextNode.Tag = groupContext; + groupContextNode.Expect(n => n.Parent).WhenCalled(invocation => + { + // Determine return value based on when it's called: + invocation.ReturnValue = newOwnerGroup.Children.Contains(groupContext.WrappedData) ? + newOwnerGroupContextNode : + originalOwnerGroupContextNode; + }).Return(null); + + var treeView = mockRepository.Stub(); + treeView.Expect(v => v.GetNodeByTag(groupContext)).Return(groupContextNode); + + var contextMenuBuilderProviderMock = mockRepository.StrictMock(); + + mockRepository.ReplayAll(); + + originalOwnerGroup.Attach(originalOwnerObserver); + newOwnerGroup.Attach(newOwnerObserver); + // Precondition: CollectionAssert.Contains(originalOwnerGroup.Children, group); CollectionAssert.DoesNotContain(newOwnerGroup.Children, group); - var nodePresenter = new PipingCalculationGroupContextNodePresenter(contextMenuBuilderProviderMock); + var nodePresenter = new PipingCalculationGroupContextNodePresenter(contextMenuBuilderProviderMock) + { + TreeView = treeView + }; // Call nodePresenter.OnDragDrop(groupContext, originalOwnerGroupContext, newOwnerGroupContext, DragOperations.Move, int.MaxValue); @@ -582,6 +629,9 @@ CollectionAssert.DoesNotContain(originalOwnerGroup.Children, group); CollectionAssert.Contains(newOwnerGroup.Children, group); Assert.AreSame(group, newOwnerGroup.Children.Last()); + + Assert.AreSame(groupContextNode, treeView.SelectedNode); + mockRepository.VerifyAll(); }