internal ListViewItem FindItemWithText (string text, bool includeSubItemsInSearch, int startIndex, bool isPrefixSearch, bool roundtrip)
{
if (startIndex < 0 || startIndex >= items.Count)
throw new ArgumentOutOfRangeException ("startIndex");
if (text == null)
throw new ArgumentNullException ("text");
if (virtual_mode) {
SearchForVirtualItemEventArgs args = new SearchForVirtualItemEventArgs (true,
isPrefixSearch, includeSubItemsInSearch, text, Point.Empty,
SearchDirectionHint.Down, startIndex);
OnSearchForVirtualItem (args);
int idx = args.Index;
if (idx >= 0 && idx < virtual_list_size)
return items [idx];
return null;
}
int i = startIndex;
while (true) {
ListViewItem lvi = items [i];
if (isPrefixSearch) { // prefix search
if (CultureInfo.CurrentCulture.CompareInfo.IsPrefix (lvi.Text, text, CompareOptions.IgnoreCase))
return lvi;
} else if (String.Compare (lvi.Text, text, true) == 0) // match
return lvi;
if (i + 1 >= items.Count) {
if (!roundtrip)
break;
i = 0;
} else
i++;
if (i == startIndex)
break;
}
// Subitems have a minor priority, so we have to do a second linear search
// Also, we don't need to to a roundtrip search for them by now
if (includeSubItemsInSearch) {
for (i = startIndex; i < items.Count; i++) {
ListViewItem lvi = items [i];
foreach (ListViewItem.ListViewSubItem sub_item in lvi.SubItems)
if (isPrefixSearch) {
if (CultureInfo.CurrentCulture.CompareInfo.IsPrefix (sub_item.Text,
text, CompareOptions.IgnoreCase))
return lvi;
} else if (String.Compare (sub_item.Text, text, true) == 0)
return lvi;
}
}
return null;
}