author | sl |
Thu, 01 Jan 2015 23:35:49 +0100 | |
changeset 405 | 5715aefd2bcc |
permissions | -rw-r--r-- |
moel@345 | 1 |
using System; |
moel@345 | 2 |
using System.Collections.Generic; |
moel@345 | 3 |
using System.Text; |
moel@345 | 4 |
using System.Windows.Forms; |
moel@345 | 5 |
|
moel@345 | 6 |
namespace Aga.Controls.Tree |
moel@345 | 7 |
{ |
moel@345 | 8 |
internal class NormalInputState : InputState |
moel@345 | 9 |
{ |
moel@345 | 10 |
private bool _mouseDownFlag = false; |
moel@345 | 11 |
|
moel@345 | 12 |
public NormalInputState(TreeViewAdv tree) : base(tree) |
moel@345 | 13 |
{ |
moel@345 | 14 |
} |
moel@345 | 15 |
|
moel@345 | 16 |
public override void KeyDown(KeyEventArgs args) |
moel@345 | 17 |
{ |
moel@345 | 18 |
if (Tree.CurrentNode == null && Tree.Root.Nodes.Count > 0) |
moel@345 | 19 |
Tree.CurrentNode = Tree.Root.Nodes[0]; |
moel@345 | 20 |
|
moel@345 | 21 |
if (Tree.CurrentNode != null) |
moel@345 | 22 |
{ |
moel@345 | 23 |
switch (args.KeyCode) |
moel@345 | 24 |
{ |
moel@345 | 25 |
case Keys.Right: |
moel@345 | 26 |
if (!Tree.CurrentNode.IsExpanded) |
moel@345 | 27 |
Tree.CurrentNode.IsExpanded = true; |
moel@345 | 28 |
else if (Tree.CurrentNode.Nodes.Count > 0) |
moel@345 | 29 |
Tree.SelectedNode = Tree.CurrentNode.Nodes[0]; |
moel@345 | 30 |
args.Handled = true; |
moel@345 | 31 |
break; |
moel@345 | 32 |
case Keys.Left: |
moel@345 | 33 |
if (Tree.CurrentNode.IsExpanded) |
moel@345 | 34 |
Tree.CurrentNode.IsExpanded = false; |
moel@345 | 35 |
else if (Tree.CurrentNode.Parent != Tree.Root) |
moel@345 | 36 |
Tree.SelectedNode = Tree.CurrentNode.Parent; |
moel@345 | 37 |
args.Handled = true; |
moel@345 | 38 |
break; |
moel@345 | 39 |
case Keys.Down: |
moel@345 | 40 |
NavigateForward(1); |
moel@345 | 41 |
args.Handled = true; |
moel@345 | 42 |
break; |
moel@345 | 43 |
case Keys.Up: |
moel@345 | 44 |
NavigateBackward(1); |
moel@345 | 45 |
args.Handled = true; |
moel@345 | 46 |
break; |
moel@345 | 47 |
case Keys.PageDown: |
moel@345 | 48 |
NavigateForward(Math.Max(1, Tree.CurrentPageSize - 1)); |
moel@345 | 49 |
args.Handled = true; |
moel@345 | 50 |
break; |
moel@345 | 51 |
case Keys.PageUp: |
moel@345 | 52 |
NavigateBackward(Math.Max(1, Tree.CurrentPageSize - 1)); |
moel@345 | 53 |
args.Handled = true; |
moel@345 | 54 |
break; |
moel@345 | 55 |
case Keys.Home: |
moel@345 | 56 |
if (Tree.RowMap.Count > 0) |
moel@345 | 57 |
FocusRow(Tree.RowMap[0]); |
moel@345 | 58 |
args.Handled = true; |
moel@345 | 59 |
break; |
moel@345 | 60 |
case Keys.End: |
moel@345 | 61 |
if (Tree.RowMap.Count > 0) |
moel@345 | 62 |
FocusRow(Tree.RowMap[Tree.RowMap.Count-1]); |
moel@345 | 63 |
args.Handled = true; |
moel@345 | 64 |
break; |
moel@345 | 65 |
case Keys.Subtract: |
moel@345 | 66 |
Tree.CurrentNode.Collapse(); |
moel@345 | 67 |
args.Handled = true; |
moel@345 | 68 |
args.SuppressKeyPress = true; |
moel@345 | 69 |
break; |
moel@345 | 70 |
case Keys.Add: |
moel@345 | 71 |
Tree.CurrentNode.Expand(); |
moel@345 | 72 |
args.Handled = true; |
moel@345 | 73 |
args.SuppressKeyPress = true; |
moel@345 | 74 |
break; |
moel@345 | 75 |
case Keys.Multiply: |
moel@345 | 76 |
Tree.CurrentNode.ExpandAll(); |
moel@345 | 77 |
args.Handled = true; |
moel@345 | 78 |
args.SuppressKeyPress = true; |
moel@345 | 79 |
break; |
moel@345 | 80 |
case Keys.A: |
moel@345 | 81 |
if (args.Modifiers == Keys.Control) |
moel@345 | 82 |
Tree.SelectAllNodes(); |
moel@345 | 83 |
break; |
moel@345 | 84 |
} |
moel@345 | 85 |
} |
moel@345 | 86 |
} |
moel@345 | 87 |
|
moel@345 | 88 |
public override void MouseDown(TreeNodeAdvMouseEventArgs args) |
moel@345 | 89 |
{ |
moel@345 | 90 |
if (args.Node != null) |
moel@345 | 91 |
{ |
moel@345 | 92 |
Tree.ItemDragMode = true; |
moel@345 | 93 |
Tree.ItemDragStart = args.Location; |
moel@345 | 94 |
|
moel@345 | 95 |
if (args.Button == MouseButtons.Left || args.Button == MouseButtons.Right) |
moel@345 | 96 |
{ |
moel@345 | 97 |
Tree.BeginUpdate(); |
moel@345 | 98 |
try |
moel@345 | 99 |
{ |
moel@345 | 100 |
Tree.CurrentNode = args.Node; |
moel@345 | 101 |
if (args.Node.IsSelected) |
moel@345 | 102 |
_mouseDownFlag = true; |
moel@345 | 103 |
else |
moel@345 | 104 |
{ |
moel@345 | 105 |
_mouseDownFlag = false; |
moel@345 | 106 |
DoMouseOperation(args); |
moel@345 | 107 |
} |
moel@345 | 108 |
} |
moel@345 | 109 |
finally |
moel@345 | 110 |
{ |
moel@345 | 111 |
Tree.EndUpdate(); |
moel@345 | 112 |
} |
moel@345 | 113 |
} |
moel@345 | 114 |
|
moel@345 | 115 |
} |
moel@345 | 116 |
else |
moel@345 | 117 |
{ |
moel@345 | 118 |
Tree.ItemDragMode = false; |
moel@345 | 119 |
MouseDownAtEmptySpace(args); |
moel@345 | 120 |
} |
moel@345 | 121 |
} |
moel@345 | 122 |
|
moel@345 | 123 |
public override void MouseUp(TreeNodeAdvMouseEventArgs args) |
moel@345 | 124 |
{ |
moel@345 | 125 |
Tree.ItemDragMode = false; |
moel@345 | 126 |
if (_mouseDownFlag && args.Node != null) |
moel@345 | 127 |
{ |
moel@345 | 128 |
if (args.Button == MouseButtons.Left) |
moel@345 | 129 |
DoMouseOperation(args); |
moel@345 | 130 |
else if (args.Button == MouseButtons.Right) |
moel@345 | 131 |
Tree.CurrentNode = args.Node; |
moel@345 | 132 |
} |
moel@345 | 133 |
_mouseDownFlag = false; |
moel@345 | 134 |
} |
moel@345 | 135 |
|
moel@345 | 136 |
|
moel@345 | 137 |
private void NavigateBackward(int n) |
moel@345 | 138 |
{ |
moel@345 | 139 |
int row = Math.Max(Tree.CurrentNode.Row - n, 0); |
moel@345 | 140 |
if (row != Tree.CurrentNode.Row) |
moel@345 | 141 |
FocusRow(Tree.RowMap[row]); |
moel@345 | 142 |
} |
moel@345 | 143 |
|
moel@345 | 144 |
private void NavigateForward(int n) |
moel@345 | 145 |
{ |
moel@345 | 146 |
int row = Math.Min(Tree.CurrentNode.Row + n, Tree.RowCount - 1); |
moel@345 | 147 |
if (row != Tree.CurrentNode.Row) |
moel@345 | 148 |
FocusRow(Tree.RowMap[row]); |
moel@345 | 149 |
} |
moel@345 | 150 |
|
moel@345 | 151 |
protected virtual void MouseDownAtEmptySpace(TreeNodeAdvMouseEventArgs args) |
moel@345 | 152 |
{ |
moel@345 | 153 |
Tree.ClearSelection(); |
moel@345 | 154 |
} |
moel@345 | 155 |
|
moel@345 | 156 |
protected virtual void FocusRow(TreeNodeAdv node) |
moel@345 | 157 |
{ |
moel@345 | 158 |
Tree.SuspendSelectionEvent = true; |
moel@345 | 159 |
try |
moel@345 | 160 |
{ |
moel@345 | 161 |
Tree.ClearSelectionInternal(); |
moel@345 | 162 |
Tree.CurrentNode = node; |
moel@345 | 163 |
Tree.SelectionStart = node; |
moel@345 | 164 |
node.IsSelected = true; |
moel@345 | 165 |
Tree.ScrollTo(node); |
moel@345 | 166 |
} |
moel@345 | 167 |
finally |
moel@345 | 168 |
{ |
moel@345 | 169 |
Tree.SuspendSelectionEvent = false; |
moel@345 | 170 |
} |
moel@345 | 171 |
} |
moel@345 | 172 |
|
moel@345 | 173 |
protected bool CanSelect(TreeNodeAdv node) |
moel@345 | 174 |
{ |
moel@345 | 175 |
if (Tree.SelectionMode == TreeSelectionMode.MultiSameParent) |
moel@345 | 176 |
{ |
moel@345 | 177 |
return (Tree.SelectionStart == null || node.Parent == Tree.SelectionStart.Parent); |
moel@345 | 178 |
} |
moel@345 | 179 |
else |
moel@345 | 180 |
return true; |
moel@345 | 181 |
} |
moel@345 | 182 |
|
moel@345 | 183 |
protected virtual void DoMouseOperation(TreeNodeAdvMouseEventArgs args) |
moel@345 | 184 |
{ |
moel@345 | 185 |
if (Tree.SelectedNodes.Count == 1 && args.Node != null && args.Node.IsSelected) |
moel@345 | 186 |
return; |
moel@345 | 187 |
|
moel@345 | 188 |
Tree.SuspendSelectionEvent = true; |
moel@345 | 189 |
try |
moel@345 | 190 |
{ |
moel@345 | 191 |
Tree.ClearSelectionInternal(); |
moel@345 | 192 |
if (args.Node != null) |
moel@345 | 193 |
args.Node.IsSelected = true; |
moel@345 | 194 |
Tree.SelectionStart = args.Node; |
moel@345 | 195 |
} |
moel@345 | 196 |
finally |
moel@345 | 197 |
{ |
moel@345 | 198 |
Tree.SuspendSelectionEvent = false; |
moel@345 | 199 |
} |
moel@345 | 200 |
} |
moel@345 | 201 |
} |
moel@345 | 202 |
} |