void TimedFilter(ObjectListView olv, string txt, int matchKind) {
			TextMatchFilter filter = null;
			if (!String.IsNullOrEmpty(txt)) {
				switch (matchKind) {
					case 0:
					default:
						filter = TextMatchFilter.Contains(olv, txt);
						break;
					case 1:
						filter = TextMatchFilter.Prefix(olv, txt);
						break;
					case 2:
						filter = TextMatchFilter.Regex(olv, txt);
						break;
				}
			}
			// Setup a default renderer to draw the filter matches
			if (filter == null) {
				olv.DefaultRenderer = null;
			}  else {
				olv.DefaultRenderer = new HighlightTextRenderer(filter);
				// Uncomment this line to see how the GDI+ rendering looks
				//olv.DefaultRenderer = new HighlightTextRenderer { Filter = filter, UseGdiTextRendering = false };
			}

			// Some lists have renderers already installed
			HighlightTextRenderer highlightingRenderer = olv.GetColumn(0).Renderer as HighlightTextRenderer;
			if (highlightingRenderer != null) {
				highlightingRenderer.Filter = filter;
			}
			Stopwatch stopWatch = new Stopwatch();
			stopWatch.Start();
			olv.AdditionalFilter = filter;
			olv.Invalidate();
			stopWatch.Stop();

			IList objects = olv.Objects as IList;
			if (objects == null) {
				string msg = String.Format("Filtered in {0}ms", stopWatch.ElapsedMilliseconds);
				this.toolTip1.SetToolTip(this.textBoxFilterTree, msg);
			} else {
				string msg = String.Format("Filtered {0} items down to {1} items in {2}ms",
				                           objects.Count,
				                           olv.Items.Count,
				                           stopWatch.ElapsedMilliseconds);
				this.toolTip1.SetToolTip(this.textBoxFilterTree, msg);
			}
		}