External/Aga.Controls/Tree/Input/NormalInputState.cs
author sl
Thu, 01 Jan 2015 23:35:49 +0100
changeset 405 5715aefd2bcc
permissions -rw-r--r--
SharpDisplay: Migrating to new robust client scheme.
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
}