Files
DynamicDataDisplay/Charts/FakePointList.cs
2024-02-23 00:46:06 -05:00

137 lines
2.5 KiB
C#

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Windows;
namespace Microsoft.Research.DynamicDataDisplay
{
[DebuggerDisplay("Count = {Count}")]
public sealed class FakePointList : IList<Point> {
private int first;
private int last;
private int count;
private Point startPoint;
private bool hasPoints;
private double leftBound;
private double rightBound;
private readonly List<Point> points;
internal FakePointList(List<Point> points, double left, double right) {
this.points = points;
this.leftBound = left;
this.rightBound = right;
Calc();
}
internal void SetXBorders(double left, double right) {
this.leftBound = left;
this.rightBound = right;
Calc();
}
private void Calc() {
Debug.Assert(leftBound <= rightBound);
first = points.FindIndex(p => p.X > leftBound);
if (first > 0)
first--;
last = points.FindLastIndex(p => p.X < rightBound);
if (last < points.Count - 1)
last++;
count = last - first;
hasPoints = first >= 0 && last > 0;
if (hasPoints) {
startPoint = points[first];
}
}
public Point StartPoint {
get { return startPoint; }
}
public bool HasPoints {
get { return hasPoints; }
}
#region IList<Point> Members
public int IndexOf(Point item) {
throw new NotSupportedException();
}
public void Insert(int index, Point item) {
throw new NotSupportedException();
}
public void RemoveAt(int index) {
throw new NotSupportedException();
}
public Point this[int index] {
get {
return points[first + 1 + index];
}
set {
throw new NotSupportedException();
}
}
#endregion
#region ICollection<Point> Members
public void Add(Point item) {
throw new NotSupportedException();
}
public void Clear() {
throw new NotSupportedException();
}
public bool Contains(Point item) {
throw new NotSupportedException();
}
public void CopyTo(Point[] array, int arrayIndex) {
throw new NotSupportedException();
}
public int Count {
get { return count; }
}
public bool IsReadOnly {
get { throw new NotSupportedException(); }
}
public bool Remove(Point item) {
throw new NotSupportedException();
}
#endregion
#region IEnumerable<Point> Members
public IEnumerator<Point> GetEnumerator() {
for (int i = first + 1; i <= last; i++) {
yield return points[i];
}
}
#endregion
#region IEnumerable Members
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() {
return GetEnumerator();
}
#endregion
}
}