using System; using System.Collections; using System.ComponentModel; using System.Linq; using System.Windows.Forms; using Core.Common.Controls; using Core.Common.Controls.Swf.TreeViewControls; using Core.Common.Gui; using Core.Common.Utils.Collections; using Ringtoets.Common.Forms.Properties; 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 ITreeView TreeView { get; set; } public Type NodeTagType { get { return typeof(T); } } public void UpdateNode(ITreeNode parentNode, ITreeNode node, object nodeData) { UpdateNode(parentNode, node, (T)nodeData); } public IEnumerable GetChildNodeObjects(object parentNodeData) { return GetChildNodeObjects((T)parentNodeData).Cast(); } public virtual bool CanRenameNode(ITreeNode node) { return false; } public virtual bool CanRenameNodeTo(ITreeNode node, string newName) { return false; } public void OnNodeRenamed(object nodeData, string newName) { var data = (T)nodeData; OnNodeRenamed(data, newName); } public virtual void OnNodeChecked(ITreeNode node) { // Not a checked node } public DragOperations CanDrag(object nodeData) { return CanDrag((T)nodeData); } public virtual DragOperations CanDrop(object item, ITreeNode sourceNode, ITreeNode targetNode, DragOperations validOperations) { return DragOperations.None; } public virtual bool CanInsert(object item, ITreeNode sourceNode, ITreeNode targetNode) { return false; } public void OnDragDrop(object item, object itemParent, object target, DragOperations operation, int position) { OnDragDrop(item, itemParent, (T)target, operation, position); } public void OnNodeSelected(object nodeData) { OnNodeSelected((T)nodeData); } public ContextMenuStrip GetContextMenu(ITreeNode node, object nodeData) { return GetContextMenu(node, (T)nodeData); } public void OnPropertyChanged(object sender, ITreeNode node, PropertyChangedEventArgs e) { OnPropertyChanged((T)sender, node, e); } public void OnCollectionChanged(object sender, NotifyCollectionChangeEventArgs e) { OnCollectionChanged((T)sender, 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(ITreeNode parentNode, ITreeNode 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 void OnNodeSelected(T nodeData) { // Do nothing } /// /// Typed implementation of method . /// /// protected virtual ContextMenuStrip GetContextMenu(ITreeNode node, T nodeData) { return null; } /// /// Typed implementation of method . /// /// protected virtual void OnPropertyChanged(T sender, ITreeNode node, PropertyChangedEventArgs e) { // Do nothing } /// /// Typed implementation of method . /// /// protected virtual void OnCollectionChanged(T sender, NotifyCollectionChangeEventArgs 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)); } } }