ソースを参照

Split TreeNode, TreeStyle and TreeBuilder into seperate files

tznind 4 年 前
コミット
7cb3812c19

+ 155 - 0
Terminal.Gui/Views/TreeBuilder.cs

@@ -0,0 +1,155 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace Terminal.Gui {
+
+	/// <summary>
+	/// Interface for supplying data to a <see cref="TreeView{T}"/> on demand as root level nodes
+	/// are expanded by the user
+	/// </summary>
+	public interface ITreeBuilder<T> {
+		/// <summary>
+		/// Returns true if <see cref="CanExpand"/> is implemented by this class
+		/// </summary>
+		/// <value></value>
+		bool SupportsCanExpand { get; }
+
+		/// <summary>
+		/// Returns true/false for whether a model has children.  This method should be implemented
+		/// when <see cref="GetChildren"/> is an expensive operation otherwise 
+		/// <see cref="SupportsCanExpand"/> should return false (in which case this method will not
+		/// be called)
+		/// </summary>
+		/// <remarks>Only implement this method if you have a very fast way of determining whether 
+		/// an object can have children e.g. checking a Type (directories can always be expanded)
+		/// </remarks>
+		/// <param name="toExpand"></param>
+		/// <returns></returns>
+		bool CanExpand (T toExpand);
+
+		/// <summary>
+		/// Returns all children of a given <paramref name="forObject"/> which should be added to the 
+		/// tree as new branches underneath it
+		/// </summary>
+		/// <param name="forObject"></param>
+		/// <returns></returns>
+		IEnumerable<T> GetChildren (T forObject);
+	}
+
+	/// <summary>
+	/// Abstract implementation of <see cref="ITreeBuilder{T}"/>.
+	/// </summary>
+	public abstract class TreeBuilder<T> : ITreeBuilder<T> {
+
+		/// <inheritdoc/>
+		public bool SupportsCanExpand { get; protected set; } = false;
+
+		/// <summary>
+		/// Override this method to return a rapid answer as to whether <see cref="GetChildren(T)"/> 
+		/// returns results.  If you are implementing this method ensure you passed true in base 
+		/// constructor or set <see cref="SupportsCanExpand"/>
+		/// </summary>
+		/// <param name="toExpand"></param>
+		/// <returns></returns>
+		public virtual bool CanExpand (T toExpand)
+		{
+
+			return GetChildren (toExpand).Any ();
+		}
+
+		/// <inheritdoc/>
+		public abstract IEnumerable<T> GetChildren (T forObject);
+
+		/// <summary>
+		/// Constructs base and initializes <see cref="SupportsCanExpand"/>
+		/// </summary>
+		/// <param name="supportsCanExpand">Pass true if you intend to 
+		/// implement <see cref="CanExpand(T)"/> otherwise false</param>
+		public TreeBuilder (bool supportsCanExpand)
+		{
+			SupportsCanExpand = supportsCanExpand;
+		}
+	}
+
+	
+
+	/// <summary>
+	/// <see cref="ITreeBuilder{T}"/> implementation for <see cref="ITreeNode"/> objects
+	/// </summary>
+	public class TreeNodeBuilder : TreeBuilder<ITreeNode> {
+
+		/// <summary>
+		/// Initialises a new instance of builder for any model objects of 
+		/// Type <see cref="ITreeNode"/>
+		/// </summary>
+		public TreeNodeBuilder () : base (false)
+		{
+
+		}
+
+		/// <summary>
+		/// Returns <see cref="ITreeNode.Children"/> from <paramref name="model"/>
+		/// </summary>
+		/// <param name="model"></param>
+		/// <returns></returns>
+		public override IEnumerable<ITreeNode> GetChildren (ITreeNode model)
+		{
+			return model.Children;
+		}
+	}
+
+	
+	/// <summary>
+	/// Implementation of <see cref="ITreeBuilder{T}"/> that uses user defined functions
+	/// </summary>
+	public class DelegateTreeBuilder<T> : TreeBuilder<T> {
+		private Func<T, IEnumerable<T>> childGetter;
+		private Func<T, bool> canExpand;
+
+		/// <summary>
+		/// Constructs an implementation of <see cref="ITreeBuilder{T}"/> that calls the user 
+		/// defined method <paramref name="childGetter"/> to determine children
+		/// </summary>
+		/// <param name="childGetter"></param>
+		/// <returns></returns>
+		public DelegateTreeBuilder (Func<T, IEnumerable<T>> childGetter) : base (false)
+		{
+			this.childGetter = childGetter;
+		}
+
+		/// <summary>
+		/// Constructs an implementation of <see cref="ITreeBuilder{T}"/> that calls the user 
+		/// defined method <paramref name="childGetter"/> to determine children 
+		/// and <paramref name="canExpand"/> to determine expandability
+		/// </summary>
+		/// <param name="childGetter"></param>
+		/// <param name="canExpand"></param>
+		/// <returns></returns>
+		public DelegateTreeBuilder (Func<T, IEnumerable<T>> childGetter, Func<T, bool> canExpand) : base (true)
+		{
+			this.childGetter = childGetter;
+			this.canExpand = canExpand;
+		}
+
+		/// <summary>
+		/// Returns whether a node can be expanded based on the delegate passed during construction
+		/// </summary>
+		/// <param name="toExpand"></param>
+		/// <returns></returns>
+		public override bool CanExpand (T toExpand)
+		{
+			return canExpand?.Invoke (toExpand) ?? base.CanExpand (toExpand);
+		}
+
+		/// <summary>
+		/// Returns children using the delegate method passed during construction
+		/// </summary>
+		/// <param name="forObject"></param>
+		/// <returns></returns>
+		public override IEnumerable<T> GetChildren (T forObject)
+		{
+			return childGetter.Invoke (forObject);
+		}
+	}
+}

+ 73 - 0
Terminal.Gui/Views/TreeNode.cs

@@ -0,0 +1,73 @@
+using System.Collections.Generic;
+
+namespace Terminal.Gui {
+		
+	/// <summary>
+	/// Interface to implement when you want the regular (non generic) <see cref="TreeView"/>
+	/// to automatically determine children for your class (without having to specify 
+	/// an <see cref="ITreeBuilder{T}"/>)
+	/// </summary>
+	public interface ITreeNode {
+		/// <summary>
+		/// Text to display when rendering the node
+		/// </summary>
+		string Text { get; set; }
+
+		/// <summary>
+		/// The children of your class which should be rendered underneath it when expanded
+		/// </summary>
+		/// <value></value>
+		IList<ITreeNode> Children { get; }
+
+		/// <summary>
+		/// Optionally allows you to store some custom data/class here.
+		/// </summary>
+		object Tag { get; set; }
+	}
+
+	/// <summary>
+	/// Simple class for representing nodes, use with regular (non generic) <see cref="TreeView"/>.
+	/// </summary>
+	public class TreeNode : ITreeNode {
+		/// <summary>
+		/// Children of the current node
+		/// </summary>
+		/// <returns></returns>
+		public virtual IList<ITreeNode> Children { get; set; } = new List<ITreeNode> ();
+
+		/// <summary>
+		/// Text to display in tree node for current entry
+		/// </summary>
+		/// <value></value>
+		public virtual string Text { get; set; }
+
+		/// <summary>
+		/// Optionally allows you to store some custom data/class here.
+		/// </summary>
+		public object Tag { get; set; }
+
+		/// <summary>
+		/// returns <see cref="Text"/>
+		/// </summary>
+		/// <returns></returns>
+		public override string ToString ()
+		{
+			return Text ?? "Unamed Node";
+		}
+
+		/// <summary>
+		/// Initialises a new instance with no <see cref="Text"/>
+		/// </summary>
+		public TreeNode ()
+		{
+
+		}
+		/// <summary>
+		/// Initialises a new instance and sets starting <see cref="Text"/>
+		/// </summary>
+		public TreeNode (string text)
+		{
+			Text = text;
+		}
+	}
+}

+ 47 - 0
Terminal.Gui/Views/TreeStyle.cs

@@ -0,0 +1,47 @@
+using System;
+
+namespace Terminal.Gui {
+	/// <summary>
+	/// Defines rendering options that affect how the tree is displayed
+	/// </summary>
+	public class TreeStyle {
+
+		/// <summary>
+		/// True to render vertical lines under expanded nodes to show which node belongs to which 
+		/// parent.  False to use only whitespace
+		/// </summary>
+		/// <value></value>
+		public bool ShowBranchLines { get; set; } = true;
+
+		/// <summary>
+		/// Symbol to use for branch nodes that can be expanded to indicate this to the user.  
+		/// Defaults to '+'. Set to null to hide
+		/// </summary>
+		public Rune? ExpandableSymbol { get; set; } = '+';
+
+		/// <summary>
+		/// Symbol to use for branch nodes that can be collapsed (are currently expanded).
+		/// Defaults to '-'.  Set to null to hide
+		/// </summary>
+		public Rune? CollapseableSymbol { get; set; } = '-';
+
+		/// <summary>
+		/// Set to true to highlight expand/collapse symbols in hot key color
+		/// </summary>
+		public bool ColorExpandSymbol { get; set; }
+
+		/// <summary>
+		/// Invert console colours used to render the expand symbol
+		/// </summary>
+		public bool InvertExpandSymbolColors { get; set; }
+
+		/// <summary>
+		/// True to leave the last row of the control free for overwritting (e.g. by a scrollbar)
+		/// When True scrolling will be triggered on the second last row of the control rather than
+		/// the last.
+		/// </summary>
+		/// <value></value>
+		public bool LeaveLastRow { get; set; }
+
+	}
+}

+ 0 - 259
Terminal.Gui/Views/TreeView.cs

@@ -9,221 +9,6 @@ using NStack;
 
 
 namespace Terminal.Gui {
 namespace Terminal.Gui {
 
 
-	/// <summary>
-	/// Interface to implement when you want the regular (non generic) <see cref="TreeView"/>
-	/// to automatically determine children for your class (without having to specify 
-	/// an <see cref="ITreeBuilder{T}"/>)
-	/// </summary>
-	public interface ITreeNode {
-		/// <summary>
-		/// Text to display when rendering the node
-		/// </summary>
-		string Text { get; set; }
-
-		/// <summary>
-		/// The children of your class which should be rendered underneath it when expanded
-		/// </summary>
-		/// <value></value>
-		IList<ITreeNode> Children { get; }
-
-		/// <summary>
-		/// Optionally allows you to store some custom data/class here.
-		/// </summary>
-		object Tag { get; set; }
-	}
-
-	/// <summary>
-	/// Simple class for representing nodes, use with regular (non generic) <see cref="TreeView"/>.
-	/// </summary>
-	public class TreeNode : ITreeNode {
-		/// <summary>
-		/// Children of the current node
-		/// </summary>
-		/// <returns></returns>
-		public virtual IList<ITreeNode> Children { get; set; } = new List<ITreeNode> ();
-
-		/// <summary>
-		/// Text to display in tree node for current entry
-		/// </summary>
-		/// <value></value>
-		public virtual string Text { get; set; }
-
-		/// <summary>
-		/// Optionally allows you to store some custom data/class here.
-		/// </summary>
-		public object Tag { get; set; }
-
-		/// <summary>
-		/// returns <see cref="Text"/>
-		/// </summary>
-		/// <returns></returns>
-		public override string ToString ()
-		{
-			return Text ?? "Unamed Node";
-		}
-
-		/// <summary>
-		/// Initialises a new instance with no <see cref="Text"/>
-		/// </summary>
-		public TreeNode ()
-		{
-
-		}
-		/// <summary>
-		/// Initialises a new instance and sets starting <see cref="Text"/>
-		/// </summary>
-		public TreeNode (string text)
-		{
-			Text = text;
-		}
-	}
-
-	/// <summary>
-	/// Interface for supplying data to a <see cref="TreeView{T}"/> on demand as root level nodes
-	/// are expanded by the user
-	/// </summary>
-	public interface ITreeBuilder<T> {
-		/// <summary>
-		/// Returns true if <see cref="CanExpand"/> is implemented by this class
-		/// </summary>
-		/// <value></value>
-		bool SupportsCanExpand { get; }
-
-		/// <summary>
-		/// Returns true/false for whether a model has children.  This method should be implemented
-		/// when <see cref="GetChildren"/> is an expensive operation otherwise 
-		/// <see cref="SupportsCanExpand"/> should return false (in which case this method will not
-		/// be called)
-		/// </summary>
-		/// <remarks>Only implement this method if you have a very fast way of determining whether 
-		/// an object can have children e.g. checking a Type (directories can always be expanded)
-		/// </remarks>
-		/// <param name="toExpand"></param>
-		/// <returns></returns>
-		bool CanExpand (T toExpand);
-
-		/// <summary>
-		/// Returns all children of a given <paramref name="forObject"/> which should be added to the 
-		/// tree as new branches underneath it
-		/// </summary>
-		/// <param name="forObject"></param>
-		/// <returns></returns>
-		IEnumerable<T> GetChildren (T forObject);
-	}
-
-	/// <summary>
-	/// Abstract implementation of <see cref="ITreeBuilder{T}"/>.
-	/// </summary>
-	public abstract class TreeBuilder<T> : ITreeBuilder<T> {
-
-		/// <inheritdoc/>
-		public bool SupportsCanExpand { get; protected set; } = false;
-
-		/// <summary>
-		/// Override this method to return a rapid answer as to whether <see cref="GetChildren(T)"/> 
-		/// returns results.  If you are implementing this method ensure you passed true in base 
-		/// constructor or set <see cref="SupportsCanExpand"/>
-		/// </summary>
-		/// <param name="toExpand"></param>
-		/// <returns></returns>
-		public virtual bool CanExpand (T toExpand)
-		{
-
-			return GetChildren (toExpand).Any ();
-		}
-
-		/// <inheritdoc/>
-		public abstract IEnumerable<T> GetChildren (T forObject);
-
-		/// <summary>
-		/// Constructs base and initializes <see cref="SupportsCanExpand"/>
-		/// </summary>
-		/// <param name="supportsCanExpand">Pass true if you intend to 
-		/// implement <see cref="CanExpand(T)"/> otherwise false</param>
-		public TreeBuilder (bool supportsCanExpand)
-		{
-			SupportsCanExpand = supportsCanExpand;
-		}
-	}
-
-	/// <summary>
-	/// <see cref="ITreeBuilder{T}"/> implementation for <see cref="ITreeNode"/> objects
-	/// </summary>
-	public class TreeNodeBuilder : TreeBuilder<ITreeNode> {
-
-		/// <summary>
-		/// Initialises a new instance of builder for any model objects of 
-		/// Type <see cref="ITreeNode"/>
-		/// </summary>
-		public TreeNodeBuilder () : base (false)
-		{
-
-		}
-
-		/// <summary>
-		/// Returns <see cref="ITreeNode.Children"/> from <paramref name="model"/>
-		/// </summary>
-		/// <param name="model"></param>
-		/// <returns></returns>
-		public override IEnumerable<ITreeNode> GetChildren (ITreeNode model)
-		{
-			return model.Children;
-		}
-	}
-
-	/// <summary>
-	/// Implementation of <see cref="ITreeBuilder{T}"/> that uses user defined functions
-	/// </summary>
-	public class DelegateTreeBuilder<T> : TreeBuilder<T> {
-		private Func<T, IEnumerable<T>> childGetter;
-		private Func<T, bool> canExpand;
-
-		/// <summary>
-		/// Constructs an implementation of <see cref="ITreeBuilder{T}"/> that calls the user 
-		/// defined method <paramref name="childGetter"/> to determine children
-		/// </summary>
-		/// <param name="childGetter"></param>
-		/// <returns></returns>
-		public DelegateTreeBuilder (Func<T, IEnumerable<T>> childGetter) : base (false)
-		{
-			this.childGetter = childGetter;
-		}
-
-		/// <summary>
-		/// Constructs an implementation of <see cref="ITreeBuilder{T}"/> that calls the user 
-		/// defined method <paramref name="childGetter"/> to determine children 
-		/// and <paramref name="canExpand"/> to determine expandability
-		/// </summary>
-		/// <param name="childGetter"></param>
-		/// <param name="canExpand"></param>
-		/// <returns></returns>
-		public DelegateTreeBuilder (Func<T, IEnumerable<T>> childGetter, Func<T, bool> canExpand) : base (true)
-		{
-			this.childGetter = childGetter;
-			this.canExpand = canExpand;
-		}
-
-		/// <summary>
-		/// Returns whether a node can be expanded based on the delegate passed during construction
-		/// </summary>
-		/// <param name="toExpand"></param>
-		/// <returns></returns>
-		public override bool CanExpand (T toExpand)
-		{
-			return canExpand?.Invoke (toExpand) ?? base.CanExpand (toExpand);
-		}
-
-		/// <summary>
-		/// Returns children using the delegate method passed during construction
-		/// </summary>
-		/// <param name="forObject"></param>
-		/// <returns></returns>
-		public override IEnumerable<T> GetChildren (T forObject)
-		{
-			return childGetter.Invoke (forObject);
-		}
-	}
-
 	/// <summary>
 	/// <summary>
 	/// Interface for all non generic members of <see cref="TreeView{T}"/>
 	/// Interface for all non generic members of <see cref="TreeView{T}"/>
 	/// </summary>
 	/// </summary>
@@ -263,50 +48,6 @@ namespace Terminal.Gui {
 		}
 		}
 	}
 	}
 
 
-	/// <summary>
-	/// Defines rendering options that affect how the tree is displayed
-	/// </summary>
-	public class TreeStyle {
-
-		/// <summary>
-		/// True to render vertical lines under expanded nodes to show which node belongs to which 
-		/// parent.  False to use only whitespace
-		/// </summary>
-		/// <value></value>
-		public bool ShowBranchLines { get; set; } = true;
-
-		/// <summary>
-		/// Symbol to use for branch nodes that can be expanded to indicate this to the user.  
-		/// Defaults to '+'. Set to null to hide
-		/// </summary>
-		public Rune? ExpandableSymbol { get; set; } = '+';
-
-		/// <summary>
-		/// Symbol to use for branch nodes that can be collapsed (are currently expanded).
-		/// Defaults to '-'.  Set to null to hide
-		/// </summary>
-		public Rune? CollapseableSymbol { get; set; } = '-';
-
-		/// <summary>
-		/// Set to true to highlight expand/collapse symbols in hot key color
-		/// </summary>
-		public bool ColorExpandSymbol { get; set; }
-
-		/// <summary>
-		/// Invert console colours used to render the expand symbol
-		/// </summary>
-		public bool InvertExpandSymbolColors { get; set; }
-
-		/// <summary>
-		/// True to leave the last row of the control free for overwritting (e.g. by a scrollbar)
-		/// When True scrolling will be triggered on the second last row of the control rather than
-		/// the last.
-		/// </summary>
-		/// <value></value>
-		public bool LeaveLastRow { get; set; }
-
-	}
-
 	/// <summary>
 	/// <summary>
 	/// Hierarchical tree view with expandable branches.  Branch objects are dynamically determined
 	/// Hierarchical tree view with expandable branches.  Branch objects are dynamically determined
 	/// when expanded using a user defined <see cref="ITreeBuilder{T}"/>
 	/// when expanded using a user defined <see cref="ITreeBuilder{T}"/>