private int IndexAtClientPoint (int x, int y)
{
if (Items.Count == 0)
return -1;
if (x < 0)
x = 0;
else if (x > ClientRectangle.Right)
x = ClientRectangle.Right;
if (y < 0)
y = 0;
else if (y > ClientRectangle.Bottom)
y = ClientRectangle.Bottom;
for (int i = top_index; i <= last_visible_index; i++)
if (GetItemDisplayRectangle (i, top_index).Contains (x, y))
return i;
return -1;
}