using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using Aga.Controls.Tree.NodeControls;
using System.Drawing;
namespace Aga.Controls.Tree{
partial class TreeViewAdv
{
private TreeNodeAdv _editingNode;
public EditableControl CurrentEditorOwner { get; private set; }
public Control CurrentEditor { get; private set; }
public void HideEditor()
{
if (CurrentEditorOwner != null)
CurrentEditorOwner.EndEdit(false);
}
internal void DisplayEditor(Control editor, EditableControl owner)
{
if (editor == null || owner == null || CurrentNode == null)
throw new ArgumentNullException();
HideEditor(false);
CurrentEditor = editor;
CurrentEditorOwner = owner;
_editingNode = CurrentNode;
editor.Validating += EditorValidating;
UpdateEditorBounds();
UpdateView();
editor.Parent = this;
editor.Focus();
owner.UpdateEditor(editor);
}
internal bool HideEditor(bool applyChanges)
{
if (CurrentEditor != null)
{
if (applyChanges)
{
if (!ApplyChanges())
return false;
}
//Check once more if editor was closed in ApplyChanges
if (CurrentEditor != null)
{
CurrentEditor.Validating -= EditorValidating;
CurrentEditorOwner.DoDisposeEditor(CurrentEditor);
CurrentEditor.Parent = null;
CurrentEditor.Dispose();
CurrentEditor = null;
CurrentEditorOwner = null;
_editingNode = null;
}
}
return true;
}
private bool ApplyChanges()
{
try
{
CurrentEditorOwner.ApplyChanges(_editingNode, CurrentEditor);
_errorProvider.Clear();
return true;
}
catch (ArgumentException ex)
{
_errorProvider.SetError(CurrentEditor, ex.Message);
/*CurrentEditor.Validating -= EditorValidating;
MessageBox.Show(this, ex.Message, "Value is not valid", MessageBoxButtons.OK, MessageBoxIcon.Warning);
CurrentEditor.Focus();
CurrentEditor.Validating += EditorValidating;*/
return false;
}
}
void EditorValidating(object sender, System.ComponentModel.CancelEventArgs e)
{
e.Cancel = !ApplyChanges();
}
public void UpdateEditorBounds()
{
if (CurrentEditor != null)
{
EditorContext context = new EditorContext();
context.Owner = CurrentEditorOwner;
context.CurrentNode = CurrentNode;
context.Editor = CurrentEditor;
context.DrawContext = _measureContext;
SetEditorBounds(context);
}
}
private void SetEditorBounds(EditorContext context)
{
foreach (NodeControlInfo info in GetNodeControls(context.CurrentNode))
{
if (context.Owner == info.Control && info.Control is EditableControl)
{
Point p = info.Bounds.Location;
p.X += info.Control.LeftMargin;
p.X -= OffsetX;
p.Y -= (_rowLayout.GetRowBounds(FirstVisibleRow).Y - ColumnHeaderHeight);
int width = DisplayRectangle.Width - p.X;
if (UseColumns && info.Control.ParentColumn != null && Columns.Contains(info.Control.ParentColumn))
{
Rectangle rect = GetColumnBounds(info.Control.ParentColumn.Index);
width = rect.Right - OffsetX - p.X;
}
context.Bounds = new Rectangle(p.X, p.Y, width, info.Bounds.Height);
((EditableControl)info.Control).SetEditorBounds(context);
return;
}
}
}
private Rectangle GetColumnBounds(int column)
{
int x = 0;
for (int i = 0; i < Columns.Count; i++)
{
if (Columns[i].IsVisible)
{
if (i < column)
x += Columns[i].Width;
else
return new Rectangle(x, 0, Columns[i].Width, 0);
}
}
return Rectangle.Empty;
}
}
}
|