Index: Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Plugin/GrassCoverErosionInwardsGuiPlugin.cs =================================================================== diff -u -re3912b8e6d94f1d0e9c765ba8ec18ed29e8484db -re54eda78fb09c7f88e3513c2184ae3e05167a8d0 --- Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Plugin/GrassCoverErosionInwardsGuiPlugin.cs (.../GrassCoverErosionInwardsGuiPlugin.cs) (revision e3912b8e6d94f1d0e9c765ba8ec18ed29e8484db) +++ Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Plugin/GrassCoverErosionInwardsGuiPlugin.cs (.../GrassCoverErosionInwardsGuiPlugin.cs) (revision e54eda78fb09c7f88e3513c2184ae3e05167a8d0) @@ -70,22 +70,7 @@ FailureMechanismContextMenuStrip, Gui); - yield return new TreeNodeInfo - { - Text = grassCoverErosionInwardsFailureMechanismContext => grassCoverErosionInwardsFailureMechanismContext.WrappedData.Name, - Image = grassCoverErosionInwardsCalculationGroupContext => RingtoetsCommonFormsResources.GeneralFolderIcon, - EnsureVisibleOnCreate = grassCoverErosionInwardsCalculationGroupContext => true, - ChildNodeObjects = CalculationGroupContextChildNodeObjects, - ContextMenuStrip = CalculationGroupContextContextMenuStrip, - CanRename = CalculationGroupContextCanRename, - OnNodeRenamed = CalculationGroupContextOnNodeRenamed, - CanRemove = CalculationGroupContextCanRemove, - OnNodeRemoved = CalculationGroupContextOnNodeRemoved, - CanDrag = CalculationGroupContextCanDrag, - CanDrop = CalculationGroupContextCanDropOrCanInsert, - CanInsert = CalculationGroupContextCanDropOrCanInsert, - OnDrop = CalculationGroupContextOnDrop - }; + yield return TreeNodeInfoFactory.CreateCalculationGroupContextTreeNodeInfo(CalculationGroupContextChildNodeObjects, context => AddCalculation(context.FailureMechanism, context.WrappedData), Gui); yield return new TreeNodeInfo { @@ -127,7 +112,7 @@ new CommentContext(calculationContext.WrappedData), new GrassCoverErosionInwardsInputContext(calculationContext.WrappedData.InputParameters, calculationContext.WrappedData, - calculationContext.GrassCoverErosionInwardsFailureMechanism, + calculationContext.FailureMechanism, calculationContext.AssessmentSection) }; @@ -334,13 +319,13 @@ if (calculation != null) { childNodeObjects.Add(new GrassCoverErosionInwardsCalculationContext(calculation, - nodeData.GrassCoverErosionInwardsFailureMechanism, + nodeData.FailureMechanism, nodeData.AssessmentSection)); } else if (group != null) { childNodeObjects.Add(new GrassCoverErosionInwardsCalculationGroupContext(group, - nodeData.GrassCoverErosionInwardsFailureMechanism, + nodeData.FailureMechanism, nodeData.AssessmentSection)); } else @@ -352,273 +337,6 @@ return childNodeObjects.ToArray(); } - private ContextMenuStrip CalculationGroupContextContextMenuStrip(GrassCoverErosionInwardsCalculationGroupContext nodeData, object parentData, TreeViewControl treeViewControl) - { - var group = nodeData.WrappedData; - - var addCalculationGroupItem = new StrictContextMenuItem( - RingtoetsCommonFormsResources.CalculationGroup_Add_CalculationGroup, - RingtoetsCommonFormsResources.FailureMechanism_Add_CalculationGroup_Tooltip, - RingtoetsCommonFormsResources.AddFolderIcon, - (o, args) => - { - var calculation = new CalculationGroup - { - Name = NamingHelper.GetUniqueName(group.Children, RingtoetsCommonDataResources.CalculationGroup_DefaultName, c => c.Name) - }; - group.Children.Add(calculation); - nodeData.WrappedData.NotifyObservers(); - }); - - var addCalculationItem = new StrictContextMenuItem( - RingtoetsCommonFormsResources.CalculationGroup_Add_Calculation, - GrassCoverErosionInwardsFormsResources.GrassCoverErosionInwardsFailureMechanism_Add_GrassCoverErosionInwardsCalculation_Tooltip, - GrassCoverErosionInwardsFormsResources.CalculationIcon, - (o, args) => { AddCalculation(nodeData.GrassCoverErosionInwardsFailureMechanism, group); }); - - var builder = Gui.Get(nodeData, treeViewControl); - - if (parentData is GrassCoverErosionInwardsFailureMechanismContext) - { - builder - .AddOpenItem() - .AddSeparator(); - } - - builder - .AddCustomItem(addCalculationGroupItem) - .AddCustomItem(addCalculationItem) - .AddSeparator(); - - var isRenamable = CalculationGroupContextCanRename(nodeData, parentData); - var isRemovable = CalculationGroupContextCanRemove(nodeData, parentData); - - if (isRenamable) - { - builder.AddRenameItem(); - } - if (isRemovable) - { - builder.AddDeleteItem(); - } - - if (isRemovable || isRenamable) - { - builder.AddSeparator(); - } - - return builder - .AddImportItem() - .AddExportItem() - .AddSeparator() - .AddExpandAllItem() - .AddCollapseAllItem() - .AddSeparator() - .AddPropertiesItem() - .Build(); - } - - private bool CalculationGroupContextCanRename(GrassCoverErosionInwardsCalculationGroupContext nodeData, object parentData) - { - return !(parentData is GrassCoverErosionInwardsFailureMechanismContext); - } - - private void CalculationGroupContextOnNodeRenamed(GrassCoverErosionInwardsCalculationGroupContext nodeData, string newName) - { - nodeData.WrappedData.Name = newName; - nodeData.NotifyObservers(); - } - - private bool CalculationGroupContextCanRemove(GrassCoverErosionInwardsCalculationGroupContext nodeData, object parentNodeData) - { - var group = parentNodeData as GrassCoverErosionInwardsCalculationGroupContext; - return group != null && group.WrappedData.Children.Contains(nodeData.WrappedData); - } - - private void CalculationGroupContextOnNodeRemoved(GrassCoverErosionInwardsCalculationGroupContext nodeData, object parentNodeData) - { - var group = parentNodeData as GrassCoverErosionInwardsCalculationGroupContext; - if (group != null) - { - group.WrappedData.Children.Remove(nodeData.WrappedData); - group.NotifyObservers(); - } - } - - private bool CalculationGroupContextCanDrag(GrassCoverErosionInwardsCalculationGroupContext nodeData, object parentData) - { - return !(parentData is GrassCoverErosionInwardsFailureMechanismContext); - } - - private bool CalculationGroupContextCanDropOrCanInsert(object draggedData, object targetData) - { - return GetAsICalculationItem(draggedData) != null && NodesHaveSameParentFailureMechanism(draggedData, targetData); - } - - private static ICalculationBase GetAsICalculationItem(object item) - { - var calculationContext = item as GrassCoverErosionInwardsCalculationContext; - if (calculationContext != null) - { - return calculationContext.WrappedData; - } - - var groupContext = item as GrassCoverErosionInwardsCalculationGroupContext; - return groupContext != null ? groupContext.WrappedData : null; - } - - private bool NodesHaveSameParentFailureMechanism(object draggedData, object targetData) - { - var sourceFailureMechanism = GetParentFailureMechanism(draggedData); - var targetFailureMechanism = GetParentFailureMechanism(targetData); - - return ReferenceEquals(sourceFailureMechanism, targetFailureMechanism); - } - - private static GrassCoverErosionInwardsFailureMechanism GetParentFailureMechanism(object data) - { - var calculationContext = data as GrassCoverErosionInwardsCalculationContext; - if (calculationContext != null) - { - return calculationContext.GrassCoverErosionInwardsFailureMechanism; - } - - var groupContext = data as GrassCoverErosionInwardsCalculationGroupContext; - return groupContext != null ? groupContext.GrassCoverErosionInwardsFailureMechanism : null; - } - - private void CalculationGroupContextOnDrop(object droppedData, object newParentData, object oldParentData, int position, TreeViewControl treeViewControl) - { - ICalculationBase calculationItem = GetAsICalculationItem(droppedData); - var originalOwnerContext = oldParentData as GrassCoverErosionInwardsCalculationGroupContext; - var target = newParentData as GrassCoverErosionInwardsCalculationGroupContext; - - if (calculationItem != null && originalOwnerContext != null && target != null) - { - var isMoveWithinSameContainer = ReferenceEquals(originalOwnerContext, target); - - DroppingCalculationInContainerStrategy dropHandler = GetDragDropStrategy(isMoveWithinSameContainer, originalOwnerContext, target); - dropHandler.Execute(droppedData, calculationItem, position, treeViewControl); - } - } - - private DroppingCalculationInContainerStrategy GetDragDropStrategy(bool isMoveWithinSameContainer, GrassCoverErosionInwardsCalculationGroupContext originalOwnerContext, GrassCoverErosionInwardsCalculationGroupContext target) - { - return isMoveWithinSameContainer - ? (DroppingCalculationInContainerStrategy) new DroppingCalculationWithinSameContainer(originalOwnerContext, target) - : new DroppingCalculationToNewContainer(originalOwnerContext, target); - } - - #region Nested Types: DroppingPipingCalculationInContainerStrategy and implementations - - /// - /// Strategy pattern implementation for dealing with drag & dropping a - /// onto data. - /// - private abstract class DroppingCalculationInContainerStrategy - { - protected readonly GrassCoverErosionInwardsCalculationGroupContext target; - private readonly GrassCoverErosionInwardsCalculationGroupContext originalOwnerContext; - - protected DroppingCalculationInContainerStrategy(GrassCoverErosionInwardsCalculationGroupContext originalOwnerContext, GrassCoverErosionInwardsCalculationGroupContext target) - { - this.originalOwnerContext = originalOwnerContext; - this.target = target; - } - - /// - /// Perform the drag & drop operation. - /// - /// The dragged data. - /// The calculation item wrapped by . - /// The index of the new position within the new owner's collection. - /// The tree view control which is at stake. - public virtual void Execute(object draggedData, ICalculationBase calculationBase, int newPosition, TreeViewControl treeViewControl) - { - MoveCalculationItemToNewOwner(calculationBase, newPosition); - - NotifyObservers(); - } - - /// - /// Moves the instance to its new location. - /// - /// The instance to be relocated. - /// The index in the new - /// owner within its . - protected void MoveCalculationItemToNewOwner(ICalculationBase calculationBase, int position) - { - originalOwnerContext.WrappedData.Children.Remove(calculationBase); - target.WrappedData.Children.Insert(position, calculationBase); - } - - /// - /// Notifies observers of the change in state. - /// - protected virtual void NotifyObservers() - { - originalOwnerContext.NotifyObservers(); - } - } - - /// - /// Strategy implementation for rearranging the order of an - /// within a through a drag & drop action. - /// - private class DroppingCalculationWithinSameContainer : DroppingCalculationInContainerStrategy - { - /// - /// Initializes a new instance of the class. - /// - /// The calculation group context that is - /// the original owner of the dragged item. - /// The calculation group context that is the target - /// of the drag & drop operation. - public DroppingCalculationWithinSameContainer(GrassCoverErosionInwardsCalculationGroupContext originalOwnerContext, GrassCoverErosionInwardsCalculationGroupContext target) : - base(originalOwnerContext, target) {} - } - - /// - /// Strategy implementation for moving an from - /// one to another using a drag & drop action. - /// - private class DroppingCalculationToNewContainer : DroppingCalculationInContainerStrategy - { - /// - /// Initializes a new instance of the class. - /// - /// The calculation group context that is - /// the original owner of the dragged item. - /// The calculation group context that is the target - /// of the drag & drop operation. - public DroppingCalculationToNewContainer(GrassCoverErosionInwardsCalculationGroupContext originalOwnerContext, GrassCoverErosionInwardsCalculationGroupContext target) : - base(originalOwnerContext, target) {} - - public override void Execute(object draggedData, ICalculationBase calculationBase, int newPosition, TreeViewControl treeViewControl) - { - MoveCalculationItemToNewOwner(calculationBase, newPosition); - - NotifyObservers(); - - // Try to start a name edit action when an item with the same name was already present - if (target.WrappedData.Children.Except(new[] - { - calculationBase - }).Any(c => c.Name.Equals(calculationBase.Name))) - { - treeViewControl.TryRenameNodeForData(draggedData); - } - } - - protected override void NotifyObservers() - { - base.NotifyObservers(); - target.NotifyObservers(); - } - } - - # endregion - #endregion } } \ No newline at end of file