public void SelectIndex(int index)
{
int oldSelectedItem = selectedItem;
int oldFirstItem = firstItem;
index = Math.Max(0, index);
selectedItem = Math.Max(0, Math.Min(completionData.Length - 1, index));
if (selectedItem < firstItem) {
FirstItem = selectedItem;
}
if (firstItem + MaxVisibleItem <= selectedItem) {
FirstItem = selectedItem - MaxVisibleItem + 1;
}
if (oldSelectedItem != selectedItem) {
if (firstItem != oldFirstItem) {
Invalidate();
} else {
int min = Math.Min(selectedItem, oldSelectedItem) - firstItem;
int max = Math.Max(selectedItem, oldSelectedItem) - firstItem;
Invalidate(new Rectangle(0, 1 + min * ItemHeight, Width, (max - min + 1) * ItemHeight));
}
OnSelectedItemChanged(EventArgs.Empty);
}
}
protected override bool ProcessTextAreaKey(Keys keyData) { if (!Visible) { return false; } switch (keyData) { case Keys.Home: codeCompletionListView.SelectIndex(0); return true; case Keys.End: codeCompletionListView.SelectIndex(completionData.Length-1); return true; case Keys.PageDown: codeCompletionListView.PageDown(); return true; case Keys.PageUp: codeCompletionListView.PageUp(); return true; case Keys.Down: codeCompletionListView.SelectNextItem(); return true; case Keys.Up: codeCompletionListView.SelectPrevItem(); return true; case Keys.Tab: InsertSelectedItem('\t'); return true; case Keys.Return: InsertSelectedItem('\n'); return true; } return base.ProcessTextAreaKey(keyData); }