|
@@ -7,12 +7,28 @@ using System.Linq.Expressions;
|
|
|
|
|
|
namespace InABox.Core
|
|
|
{
|
|
|
- public class CoreTreeNode<TKey> : INotifyPropertyChanged
|
|
|
+ public interface ICoreTreeNode
|
|
|
+ {
|
|
|
+ object? ID { get; set; }
|
|
|
+ object? Parent { get; set; }
|
|
|
+ object? Image { get; set; }
|
|
|
+ CoreRow? Row { get; set; }
|
|
|
+ object? this[string column] { get; set; }
|
|
|
+ string Number { get; }
|
|
|
+ }
|
|
|
+
|
|
|
+ public class CoreTreeNode<TKey> : INotifyPropertyChanged, ICoreTreeNode
|
|
|
{
|
|
|
|
|
|
private CoreTreeNodes<TKey> _owner;
|
|
|
|
|
|
public ObservableCollection<CoreTreeNode<TKey>> Children => new ObservableCollection<CoreTreeNode<TKey>>(_owner.GetChildrenOfParent(_id));
|
|
|
+
|
|
|
+ object? ICoreTreeNode.ID
|
|
|
+ {
|
|
|
+ get => ID;
|
|
|
+ set => ID = (TKey)value!;
|
|
|
+ }
|
|
|
|
|
|
private TKey _id;
|
|
|
public TKey ID
|
|
@@ -25,6 +41,13 @@ namespace InABox.Core
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ object? ICoreTreeNode.Parent
|
|
|
+ {
|
|
|
+ get => Parent;
|
|
|
+ set => Parent = (TKey)value!;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
private TKey _parent;
|
|
|
public TKey Parent
|
|
|
{
|
|
@@ -36,8 +59,8 @@ namespace InABox.Core
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- private object _image;
|
|
|
- public object Image
|
|
|
+ private object? _image;
|
|
|
+ public object? Image
|
|
|
{
|
|
|
get => _image;
|
|
|
set
|
|
@@ -122,42 +145,42 @@ namespace InABox.Core
|
|
|
|
|
|
}
|
|
|
|
|
|
- public class CoreTreeNodes<TNode, TKey> where TNode : CoreTreeNode<TKey>
|
|
|
+ public class CoreTreeNodes<TKey>
|
|
|
{
|
|
|
- private List<TNode> _nodes;
|
|
|
- private Dictionary<TKey, TNode> _nodeMap;
|
|
|
+ private List<CoreTreeNode<TKey>> _nodes;
|
|
|
+ private Dictionary<TKey, CoreTreeNode<TKey>> _nodeMap;
|
|
|
|
|
|
public TKey DefaultKey { get; set; }
|
|
|
|
|
|
- public ObservableCollection<TNode> Nodes => new ObservableCollection<TNode>(_nodes.Where(x => Equals(x.Parent, DefaultKey)));
|
|
|
+ public ObservableCollection<CoreTreeNode<TKey>> Nodes => new ObservableCollection<CoreTreeNode<TKey>>(_nodes.Where(x => Equals(x.Parent, DefaultKey)));
|
|
|
|
|
|
- public TNode? this[TKey id] => _nodeMap.GetValueOrDefault(id);
|
|
|
+ public CoreTreeNode<TKey>? this[TKey id] => _nodeMap.GetValueOrDefault(id);
|
|
|
|
|
|
public CoreTreeNodes(TKey defaultKey)
|
|
|
{
|
|
|
- _nodes = new List<TNode>();
|
|
|
- _nodeMap = new Dictionary<TKey, TNode>();
|
|
|
+ _nodes = new List<CoreTreeNode<TKey>>();
|
|
|
+ _nodeMap = new Dictionary<TKey, CoreTreeNode<TKey>>();
|
|
|
DefaultKey = defaultKey;
|
|
|
}
|
|
|
|
|
|
- public TNode Add(TKey id, TKey parent, CoreRow row)
|
|
|
+ public CoreTreeNode<TKey> Add(TKey id, TKey parent, CoreRow row)
|
|
|
{
|
|
|
- var node = (TNode)Activator.CreateInstance(typeof(TNode), this, id, parent, row );
|
|
|
+ var node = new CoreTreeNode<TKey>(this, id, parent, row);
|
|
|
_nodes.Add(node);
|
|
|
_nodeMap[id] = node;
|
|
|
return node;
|
|
|
}
|
|
|
|
|
|
- public TNode Find(TKey id) => _nodeMap.GetValueOrDefault(id);
|
|
|
+ public CoreTreeNode<TKey> Find(TKey id) => _nodeMap.GetValueOrDefault(id);
|
|
|
|
|
|
- public TNode? Find(CoreRow row) => _nodes.FirstOrDefault(x => x.Row == row);
|
|
|
+ public CoreTreeNode<TKey>? Find(CoreRow row) => _nodes.FirstOrDefault(x => x.Row == row);
|
|
|
|
|
|
/// <summary>
|
|
|
/// Gets a given node and recursively all its children given by <paramref name="id"/>.
|
|
|
/// </summary>
|
|
|
/// <param name="id"></param>
|
|
|
/// <returns></returns>
|
|
|
- public IEnumerable<TNode> GetChildren(TKey id)
|
|
|
+ public IEnumerable<CoreTreeNode<TKey>> GetChildren(TKey id)
|
|
|
{
|
|
|
if(!_nodeMap.TryGetValue(id, out var node))
|
|
|
{
|
|
@@ -175,7 +198,7 @@ namespace InABox.Core
|
|
|
/// </summary>
|
|
|
/// <param name="id"></param>
|
|
|
/// <returns></returns>
|
|
|
- public IEnumerable<TNode> GetChildrenOfParent(TKey id)
|
|
|
+ public IEnumerable<CoreTreeNode<TKey>> GetChildrenOfParent(TKey id)
|
|
|
{
|
|
|
return _nodes.Where(x => object.Equals(x.Parent, id) && !object.Equals(x.ID, id));
|
|
|
}
|
|
@@ -199,12 +222,5 @@ namespace InABox.Core
|
|
|
ColumnChanged?.Invoke(node, column);
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- public class CoreTreeNodes<TKey> : CoreTreeNodes<CoreTreeNode<TKey>, TKey>
|
|
|
- {
|
|
|
- public CoreTreeNodes(TKey defaultKey) : base(defaultKey)
|
|
|
- {
|
|
|
-
|
|
|
- }
|
|
|
- }
|
|
|
+
|
|
|
}
|