149 lines
5.5 KiB
C#

using System;
using System.Windows.Forms;
namespace DevComponents.Tree
{
/// <summary>
/// Provides TreeGX Keyboard handling.
/// </summary>
internal class KeyNavigation
{
public static void KeyDown(TreeGX tree, KeyEventArgs e)
{
switch(e.KeyCode)
{
case Keys.Enter:
{
EnterKeyDown(tree, e);
e.Handled = true;
break;
}
case Keys.Up:
case Keys.Down:
case Keys.Left:
case Keys.Right:
{
NavigateKeyDown(tree, e);
e.Handled = true;
break;
}
}
}
public static void EnterKeyDown(TreeGX tree, KeyEventArgs e)
{
if(tree.SelectedNode!=null && tree.SelectedNode.Nodes.Count>0)
{
tree.SelectedNode.Toggle(eTreeAction.Keyboard);
}
}
public static void NavigateKeyDown(TreeGX tree, KeyEventArgs e)
{
if(tree.SelectedNode==null)
{
if(tree.DisplayRootNode!=null)
tree.SelectNode(tree.DisplayRootNode, eTreeAction.Keyboard);
else if(tree.Nodes.Count>0)
tree.SelectNode(tree.Nodes[0], eTreeAction.Keyboard);
return;
}
Node node=tree.SelectedNode;
if(e.KeyCode == Keys.Down || e.KeyCode == Keys.Right && NodeOperations.GetVisibleChildNodesCount(node) == 0)
{
int currentCell = 0;
if (node != null && node.SelectedCell != null) currentCell = node.Cells.IndexOf(node.SelectedCell);
Node nextNode = NodeOperations.GetNextVisibleNode(node);
//// Adjust nextNode so the multi-selection is proper
//if ((e.KeyData & Keys.Shift) == Keys.Shift && tree.MultiSelect && tree.SelectedNodes.Count > 1)
//{
// if (tree.SelectedNodes[0].Bounds.Y > tree.SelectedNodes[tree.SelectedNodes.Count - 1].Bounds.Y)
// nextNode = tree.SelectedNodes[tree.SelectedNodes.Count - 1];
//}
if (nextNode != null)
{
if (!nextNode.CanSelect)
{
int counter = 0;
while (nextNode != null && counter < 100)
{
nextNode = NodeOperations.GetNextVisibleNode(nextNode);
if (nextNode != null && nextNode.CanSelect) break;
}
}
//if ((e.KeyData & Keys.Shift) == Keys.Shift && tree.MultiSelect && tree.SelectedNodes.Count > 0)
//{
// if (tree.MultiSelectRule == eMultiSelectRule.SameParent && tree.SelectedNodes[0].Parent != nextNode.Parent) return true;
// if (nextNode.IsSelected)
// tree.SelectedNodes.Remove(nextNode, eTreeAction.Keyboard);
// else
// tree.SelectedNodes.Add(nextNode, eTreeAction.Keyboard);
// nextNode.EnsureVisible();
//}
//else
{
tree.SelectNode(nextNode, eTreeAction.Keyboard);
//if (tree.SelectionPerCell && currentCell < nextNode.Cells.Count && currentCell > 0)
// nextNode.SetSelectedCell(nextNode.Cells[currentCell], eTreeAction.Keyboard);
}
}
}
else if(e.KeyCode == Keys.Up || e.KeyCode == Keys.Left && node.Parent == null)
{
int currentCell = 0;
if (node != null && node.SelectedCell != null) currentCell = node.Cells.IndexOf(node.SelectedCell);
Node prevNode = NodeOperations.GetPreviousVisibleNode(node);
if (prevNode != null)
{
if (!prevNode.CanSelect)
{
int counter = 0;
while (prevNode != null && counter < 100)
{
prevNode = NodeOperations.GetPreviousVisibleNode(prevNode);
if (prevNode != null && prevNode.CanSelect) break;
}
}
//if ((e.KeyData & Keys.Shift) == Keys.Shift && tree.MultiSelect && tree.SelectedNodes.Count > 0)
//{
// if (tree.MultiSelectRule == eMultiSelectRule.SameParent && tree.SelectedNodes[0].Parent != prevNode.Parent) return true;
// if (prevNode.IsSelected)
// {
// tree.SelectedNodes.Remove(tree.SelectedNodes[tree.SelectedNodes.Count - 1], eTreeAction.Keyboard);
// }
// else
// tree.SelectedNodes.Add(prevNode, eTreeAction.Keyboard);
// prevNode.EnsureVisible();
//}
//else
if (prevNode != null)
{
tree.SelectNode(prevNode, eTreeAction.Keyboard);
//if (tree.SelectionPerCell && currentCell < prevNode.Cells.Count && currentCell > 0)
// prevNode.SetSelectedCell(prevNode.Cells[currentCell], eTreeAction.Keyboard);
}
}
}
else if(e.KeyCode == Keys.Right)
{
Node childNode = NodeOperations.GetFirstVisibleChildNode(node);
if(childNode!=null)
tree.SelectNode(childNode, eTreeAction.Keyboard);
}
else if(e.KeyCode == Keys.Left)
{
if(node.Parent!=null)
tree.SelectNode(node.Parent, eTreeAction.Keyboard);
}
}
}
}