Browse Source

Remove TreeViewHelper and shorten the code so the extra struct is not needed.

pull/2347/head
Dariusz Komosinski 8 years ago
parent
commit
c3480fb840
  1. 50
      src/Avalonia.Controls/TreeView.cs
  2. 90
      src/Avalonia.Controls/TreeViewHelper.cs

50
src/Avalonia.Controls/TreeView.cs

@ -554,6 +554,54 @@ namespace Avalonia.Controls
}
}
/// <summary>
/// Find which node is first in hierarchy.
/// </summary>
/// <param name="treeView">Search root.</param>
/// <param name="nodeA">Nodes to find.</param>
/// <param name="nodeB">Node to find.</param>
/// <returns>Found first node.</returns>
private static TreeViewItem FindFirstNode(TreeView treeView, TreeViewItem nodeA, TreeViewItem nodeB)
{
return FindInContainers(treeView.ItemContainerGenerator, nodeA, nodeB);
}
private static TreeViewItem FindInContainers(ITreeItemContainerGenerator containerGenerator,
TreeViewItem nodeA,
TreeViewItem nodeB)
{
IEnumerable<ItemContainerInfo> containers = containerGenerator.Containers;
foreach (ItemContainerInfo container in containers)
{
TreeViewItem node = FindFirstNode(container.ContainerControl as TreeViewItem, nodeA, nodeB);
if (node != null)
{
return node;
}
}
return null;
}
private static TreeViewItem FindFirstNode(TreeViewItem node, TreeViewItem nodeA, TreeViewItem nodeB)
{
if (node == null)
{
return null;
}
TreeViewItem match = node == nodeA ? nodeA : node == nodeB ? nodeB : null;
if (match != null)
{
return match;
}
return FindInContainers(node.ItemContainerGenerator, nodeA, nodeB);
}
/// <summary>
/// Returns all items that belong to containers between <paramref name="from"/> and <paramref name="to"/>.
/// The range is inclusive.
@ -569,7 +617,7 @@ namespace Avalonia.Controls
return items;
}
TreeViewItem firstItem = TreeViewHelper.FindFirstNode(this, new TreeViewHelper.SearchInfo(from, to));
TreeViewItem firstItem = FindFirstNode(this, from, to);
if (firstItem == null)
{

90
src/Avalonia.Controls/TreeViewHelper.cs

@ -1,90 +0,0 @@
// Copyright (c) The Avalonia Project. All rights reserved.
// Licensed under the MIT license. See licence.md file in the project root for full license information.
using System.Collections.Generic;
using Avalonia.Controls.Generators;
namespace Avalonia.Controls
{
/// <summary>
/// Helper for <see cref="TreeView"/> related operations.
/// </summary>
internal static class TreeViewHelper
{
/// <summary>
/// Find which node from search info is first in hierarchy.
/// </summary>
/// <param name="treeView">Search root.</param>
/// <param name="searchInfo">Nodes to search for.</param>
/// <returns>Found first node.</returns>
public static TreeViewItem FindFirstNode(TreeView treeView, in SearchInfo searchInfo)
{
return FindInContainers(treeView.ItemContainerGenerator, in searchInfo);
}
private static TreeViewItem FindInContainers(ITreeItemContainerGenerator containerGenerator,
in SearchInfo searchInfo)
{
IEnumerable<ItemContainerInfo> containers = containerGenerator.Containers;
foreach (ItemContainerInfo container in containers)
{
TreeViewItem node = FindFirstNode(container.ContainerControl as TreeViewItem, in searchInfo);
if (node != null)
{
return node;
}
}
return null;
}
private static TreeViewItem FindFirstNode(TreeViewItem node, in SearchInfo searchInfo)
{
if (node == null)
{
return null;
}
TreeViewItem match = searchInfo.GetMatch(node);
if (match != null)
{
return match;
}
return FindInContainers(node.ItemContainerGenerator, in searchInfo);
}
/// <summary>
/// Node search info.
/// </summary>
public readonly struct SearchInfo
{
public readonly TreeViewItem Search1;
public readonly TreeViewItem Search2;
public SearchInfo(TreeViewItem search1, TreeViewItem search2)
{
Search1 = search1;
Search2 = search2;
}
public TreeViewItem GetMatch(TreeViewItem candidate)
{
if (candidate == Search1)
{
return Search1;
}
if (candidate == Search2)
{
return Search2;
}
return null;
}
}
}
}
Loading…
Cancel
Save