External/Aga.Controls/Tree/NodeControls/EditableControl.cs
author Stephane Lenclud
Sat, 30 Jan 2016 23:01:51 +0100
branchMiniDisplay
changeset 454 f84878f52cd9
permissions -rw-r--r--
Disabling Nuvoton NCT6791D because of fan full speed bug on Asus Z97 WS.
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
using System.Drawing;
moel@345
     6
using System.ComponentModel;
moel@345
     7
moel@345
     8
namespace Aga.Controls.Tree.NodeControls
moel@345
     9
{
moel@345
    10
	public abstract class EditableControl : InteractiveControl
moel@345
    11
	{
moel@345
    12
		private Timer _timer;
moel@345
    13
		private bool _editFlag;
moel@345
    14
moel@345
    15
		#region Properties
moel@345
    16
moel@345
    17
		private bool _editOnClick = false;
moel@345
    18
		[DefaultValue(false)]
moel@345
    19
		public bool EditOnClick
moel@345
    20
		{
moel@345
    21
			get { return _editOnClick; }
moel@345
    22
			set { _editOnClick = value; }
moel@345
    23
		}
moel@345
    24
moel@345
    25
		#endregion
moel@345
    26
moel@345
    27
		protected EditableControl()
moel@345
    28
		{
moel@345
    29
			_timer = new Timer();
moel@345
    30
			_timer.Interval = 500;
moel@345
    31
			_timer.Tick += new EventHandler(TimerTick);
moel@345
    32
		}
moel@345
    33
moel@345
    34
		private void TimerTick(object sender, EventArgs e)
moel@345
    35
		{
moel@345
    36
			_timer.Stop();
moel@345
    37
			if (_editFlag)
moel@345
    38
				BeginEdit();
moel@345
    39
			_editFlag = false;
moel@345
    40
		}
moel@345
    41
moel@345
    42
		public void SetEditorBounds(EditorContext context)
moel@345
    43
		{
moel@345
    44
			Size size = CalculateEditorSize(context);
moel@345
    45
			context.Editor.Bounds = new Rectangle(context.Bounds.X, context.Bounds.Y,
moel@345
    46
				Math.Min(size.Width, context.Bounds.Width),
moel@345
    47
				Math.Min(size.Height, Parent.ClientSize.Height - context.Bounds.Y)
moel@345
    48
			);
moel@345
    49
		}
moel@345
    50
moel@345
    51
		protected abstract Size CalculateEditorSize(EditorContext context);
moel@345
    52
moel@345
    53
		protected virtual bool CanEdit(TreeNodeAdv node)
moel@345
    54
		{
moel@345
    55
			return (node.Tag != null) && IsEditEnabled(node);
moel@345
    56
		}
moel@345
    57
moel@345
    58
		public void BeginEdit()
moel@345
    59
		{
moel@345
    60
			if (Parent != null && Parent.CurrentNode != null && CanEdit(Parent.CurrentNode))
moel@345
    61
			{
moel@345
    62
				CancelEventArgs args = new CancelEventArgs();
moel@345
    63
				OnEditorShowing(args);
moel@345
    64
				if (!args.Cancel)
moel@345
    65
				{
moel@345
    66
					var editor = CreateEditor(Parent.CurrentNode);
moel@345
    67
					Parent.DisplayEditor(editor, this);
moel@345
    68
				}
moel@345
    69
			}
moel@345
    70
		}
moel@345
    71
moel@345
    72
		public void EndEdit(bool applyChanges)
moel@345
    73
		{
moel@345
    74
			if (Parent != null)
moel@345
    75
				if (Parent.HideEditor(applyChanges))
moel@345
    76
					OnEditorHided();
moel@345
    77
		}
moel@345
    78
moel@345
    79
		public virtual void UpdateEditor(Control control)
moel@345
    80
		{
moel@345
    81
		}
moel@345
    82
moel@345
    83
		internal void ApplyChanges(TreeNodeAdv node, Control editor)
moel@345
    84
		{
moel@345
    85
			DoApplyChanges(node, editor);
moel@345
    86
			OnChangesApplied();
moel@345
    87
		}
moel@345
    88
moel@345
    89
		internal void DoDisposeEditor(Control editor)
moel@345
    90
		{
moel@345
    91
			DisposeEditor(editor);
moel@345
    92
		}
moel@345
    93
moel@345
    94
		protected abstract void DoApplyChanges(TreeNodeAdv node, Control editor);
moel@345
    95
moel@345
    96
		protected abstract Control CreateEditor(TreeNodeAdv node);
moel@345
    97
moel@345
    98
		protected abstract void DisposeEditor(Control editor);
moel@345
    99
moel@345
   100
		public virtual void Cut(Control control)
moel@345
   101
		{
moel@345
   102
		}
moel@345
   103
moel@345
   104
		public virtual void Copy(Control control)
moel@345
   105
		{
moel@345
   106
		}
moel@345
   107
moel@345
   108
		public virtual void Paste(Control control)
moel@345
   109
		{
moel@345
   110
		}
moel@345
   111
moel@345
   112
		public virtual void Delete(Control control)
moel@345
   113
		{
moel@345
   114
		}
moel@345
   115
moel@345
   116
		public override void MouseDown(TreeNodeAdvMouseEventArgs args)
moel@345
   117
		{
moel@345
   118
			_editFlag = (!EditOnClick && args.Button == MouseButtons.Left
moel@345
   119
				&& args.ModifierKeys == Keys.None && args.Node.IsSelected);
moel@345
   120
		}
moel@345
   121
moel@345
   122
		public override void MouseUp(TreeNodeAdvMouseEventArgs args)
moel@345
   123
		{
moel@345
   124
			if (args.Node.IsSelected)
moel@345
   125
			{
moel@345
   126
				if (EditOnClick && args.Button == MouseButtons.Left && args.ModifierKeys == Keys.None)
moel@345
   127
				{
moel@345
   128
					Parent.ItemDragMode = false;
moel@345
   129
					BeginEdit();
moel@345
   130
					args.Handled = true;
moel@345
   131
				}
moel@345
   132
				else if (_editFlag)// && args.Node.IsSelected)
moel@345
   133
					_timer.Start();
moel@345
   134
			}
moel@345
   135
		}
moel@345
   136
moel@345
   137
		public override void MouseDoubleClick(TreeNodeAdvMouseEventArgs args)
moel@345
   138
		{
moel@345
   139
			_editFlag = false;
moel@345
   140
			_timer.Stop();
moel@345
   141
		}
moel@345
   142
moel@345
   143
		protected override void Dispose(bool disposing)
moel@345
   144
		{
moel@345
   145
			base.Dispose(disposing);
moel@345
   146
			if (disposing)
moel@345
   147
				_timer.Dispose();
moel@345
   148
		}
moel@345
   149
moel@345
   150
		#region Events
moel@345
   151
moel@345
   152
		public event CancelEventHandler EditorShowing;
moel@345
   153
		protected void OnEditorShowing(CancelEventArgs args)
moel@345
   154
		{
moel@345
   155
			if (EditorShowing != null)
moel@345
   156
				EditorShowing(this, args);
moel@345
   157
		}
moel@345
   158
moel@345
   159
		public event EventHandler EditorHided;
moel@345
   160
		protected void OnEditorHided()
moel@345
   161
		{
moel@345
   162
			if (EditorHided != null)
moel@345
   163
				EditorHided(this, EventArgs.Empty);
moel@345
   164
		}
moel@345
   165
moel@345
   166
		public event EventHandler ChangesApplied;
moel@345
   167
		protected void OnChangesApplied()
moel@345
   168
		{
moel@345
   169
			if (ChangesApplied != null)
moel@345
   170
				ChangesApplied(this, EventArgs.Empty);
moel@345
   171
		}
moel@345
   172
moel@345
   173
		#endregion
moel@345
   174
	}
moel@345
   175
}