149 lines
5.5 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|
|
}
|