/********************************************************
* ADO.NET 2.0 Data Provider for SQLite Version 3.X
* Written by Robert Simpson (robert@blackcastlesoft.com)
*
* Released to the public domain, use at your own risk!
********************************************************/
namespace SQLite.Designer.Editors
{
using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Drawing;
public class AutoCompleteColumn : DataGridViewColumn
{
public AutoCompleteColumn()
: base(new AutoCompleteCell())
{
}
}
public class AutoCompleteCell : DataGridViewTextBoxCell
{
public override Type EditType
{
get
{
return typeof(AutoCompleteEditingControl);
}
}
}
public class AutoCompleteEditingControl : DataGridViewComboBoxEditingControl
{
private bool inPrepare;
private bool isDeleting;
public override object EditingControlFormattedValue
{
get
{
return base.Text;
}
set
{
base.Text = value as string;
}
}
public override void PrepareEditingControlForEdit(bool selectAll)
{
inPrepare = true;
base.PrepareEditingControlForEdit(selectAll);
if (base.Items.Count == 0)
{
base.Items.Add("integer");
base.Items.Add("int");
base.Items.Add("smallint");
base.Items.Add("tinyint");
base.Items.Add("bigint");
base.Items.Add("bit");
base.Items.Add("varchar(50)");
base.Items.Add("nvarchar(50)");
base.Items.Add("text");
base.Items.Add("ntext");
base.Items.Add("image");
base.Items.Add("money");
base.Items.Add("float");
base.Items.Add("real");
base.Items.Add("decimal");
base.Items.Add("numeric(18,0)");
base.Items.Add("char(10)");
base.Items.Add("nchar(10)");
base.Items.Add("datetime");
base.Items.Add("guid");
}
base.DropDownStyle = ComboBoxStyle.DropDown;
base.Text = EditingControlDataGridView.CurrentCell.Value as string;
if (selectAll)
base.SelectAll();
inPrepare = false;
}
public override bool EditingControlWantsInputKey(Keys keyData, bool dataGridViewWantsInputKey)
{
isDeleting = false;
switch (keyData & Keys.KeyCode)
{
case Keys.Delete:
case Keys.Back:
isDeleting = true;
break;
}
if (((keyData & Keys.KeyCode) == Keys.Left && (base.SelectionStart > 0 || base.SelectionLength > 0))
|| ((keyData & Keys.KeyCode) == Keys.Right && (base.SelectionStart < base.Text.Length || base.SelectionLength > 0))
|| (((keyData & Keys.KeyCode) == Keys.Home || (keyData & Keys.KeyCode) == Keys.End) && base.SelectionLength != base.Text.Length)
)
{
return true;
}
return base.EditingControlWantsInputKey(keyData, dataGridViewWantsInputKey);
}
protected override void OnTextChanged(EventArgs e)
{
if (inPrepare) return;
base.OnTextChanged(e);
bool changed = !(EditingControlDataGridView.CurrentCell.Value as string == base.Text ||
(String.IsNullOrEmpty(base.Text) && String.IsNullOrEmpty(EditingControlDataGridView.CurrentCell.Value as string)));
if ((base.SelectionLength == 0 || base.SelectionStart == base.Text.Length) && isDeleting == false)
{
if (base.Items.Contains(base.Text) == false)
{
for (int n = 0; n < base.Items.Count; n++)
{
if (((string)base.Items[n]).StartsWith(base.Text, StringComparison.OrdinalIgnoreCase) == true)
{
int start = base.SelectionStart;
inPrepare = true;
base.Text = base.Items[n] as string;
base.SelectionStart = start;
base.SelectionLength = base.Text.Length - start;
inPrepare = false;
break;
}
}
}
}
EditingControlValueChanged = changed;
EditingControlDataGridView.NotifyCurrentCellDirty(changed);
}
}
}