using System; using System.Collections; using System.ComponentModel; using System.Linq; using System.Windows.Forms; using Core.Common.Controls.TreeView; using Core.Common.Gui; using Ringtoets.Common.Forms.Properties; using TreeNode = Core.Common.Controls.TreeView.TreeNode; using TreeView = Core.Common.Controls.TreeView.TreeView; namespace Ringtoets.Common.Forms.NodePresenters { /// /// Implements in a featureless way as possible, /// to serve as a base class for all node presenters. /// /// The data object class corresponding with the node. public abstract class RingtoetsNodePresenterBase : ITreeNodePresenter { protected readonly IContextMenuBuilderProvider contextMenuBuilderProvider; /// /// Creates a new instance of , which uses the /// to create and bind its . /// /// The /// to use for building a . /// Thrown when no was provided. public RingtoetsNodePresenterBase(IContextMenuBuilderProvider contextMenuBuilderProvider) { if (contextMenuBuilderProvider == null) { throw new ArgumentNullException("contextMenuBuilderProvider", Core.Common.Gui.Properties.Resources.NodePresenter_ContextMenuBuilderProvider_required); } this.contextMenuBuilderProvider = contextMenuBuilderProvider; } public TreeView TreeView { get; set; } public Type NodeTagType { get { return typeof(T); } } public void UpdateNode(TreeNode parentNode, TreeNode node, object nodeData) { UpdateNode(parentNode, node, (T)nodeData); } public IEnumerable GetChildNodeObjects(object parentNodeData) { return GetChildNodeObjects((T)parentNodeData).Cast(); } public virtual bool CanRenameNode(TreeNode node) { return false; } public virtual bool CanRenameNodeTo(TreeNode node, string newName) { return false; } public void OnNodeRenamed(object nodeData, string newName) { var data = (T)nodeData; OnNodeRenamed(data, newName); } public virtual void OnNodeChecked(TreeNode node) { // Not a checked node } public DragOperations CanDrag(object nodeData) { return CanDrag((T)nodeData); } public virtual DragOperations CanDrop(object item, TreeNode sourceNode, TreeNode targetNode, DragOperations validOperations) { return DragOperations.None; } public virtual bool CanInsert(object item, TreeNode sourceNode, TreeNode targetNode) { return false; } public void OnDragDrop(object item, object itemParent, object target, DragOperations operation, int position) { OnDragDrop(item, itemParent, (T)target, operation, position); } public ContextMenuStrip GetContextMenu(TreeNode node, object nodeData) { return GetContextMenu(node, (T)nodeData); } public void OnPropertyChanged(object sender, TreeNode node, PropertyChangedEventArgs e) { OnPropertyChanged((T)sender, node, e); } public bool CanRemove(object parentNodeData, object nodeData) { return CanRemove(parentNodeData, (T)nodeData); } public bool RemoveNodeData(object parentNodeData, object nodeData) { return RemoveNodeData(parentNodeData, (T)nodeData); } /// /// Typed implementation of method . /// /// protected abstract void UpdateNode(TreeNode parentNode, TreeNode node, T nodeData); /// /// Typed implementation of method . /// /// protected virtual IEnumerable GetChildNodeObjects(T nodeData) { return Enumerable.Empty(); } /// /// Typed implementation of method . /// /// protected virtual void OnNodeRenamed(T nodeData, string newName) { throw new InvalidOperationException(string.Format(Resources.RingtoetsNodePresenterBase_OnNodeRenamed_Cannot_rename_tree_node_of_type_0_, GetType().Name)); } /// /// Typed implementation of method . /// /// protected virtual DragOperations CanDrag(T nodeData) { return DragOperations.None; } /// /// Typed implementation of method . /// /// protected virtual void OnDragDrop(object item, object itemParent, T target, DragOperations operation, int position) { // Do nothing } /// /// Typed implementation of method . /// /// protected virtual ContextMenuStrip GetContextMenu(TreeNode node, T nodeData) { return null; } /// /// Typed implementation of method . /// /// protected virtual void OnPropertyChanged(T sender, TreeNode node, PropertyChangedEventArgs e) { // Do nothing } /// /// Typed implementation of method . /// /// protected virtual bool CanRemove(object parentNodeData, T nodeData) { return false; } /// /// Typed implementation of method . /// /// protected virtual bool RemoveNodeData(object parentNodeData, T nodeData) { throw new InvalidOperationException(String.Format(Resources.RingtoetsNodePresenterBase_RemoveNodeData_Cannot_delete_node_of_type_0_, GetType().Name)); } } }