using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.Research.DynamicDataDisplay.Common.Auxiliary; namespace Microsoft.Research.DynamicDataDisplay.Charts { internal abstract class MinorTimeProviderBase : ITicksProvider { public event EventHandler Changed; protected void RaiseChanged() { if (Changed != null) { Changed(this, EventArgs.Empty); } } private readonly ITicksProvider provider; public MinorTimeProviderBase(ITicksProvider provider) { this.provider = provider; } private T[] majorTicks = new T[] { }; internal void SetTicks(T[] ticks) { this.majorTicks = ticks; } private double ticksSize = 0.5; public ITicksInfo GetTicks(Range range, int ticksCount) { if (majorTicks.Length == 0) return new TicksInfo(); ticksCount /= majorTicks.Length; if (ticksCount == 0) ticksCount = 2; var ticks = majorTicks.GetPairs().Select(r => Clip(provider.GetTicks(r, ticksCount), r)). SelectMany(t => t.Ticks).ToArray(); var res = new TicksInfo { Ticks = ticks, TickSizes = ArrayExtensions.CreateArray(ticks.Length, ticksSize) }; return res; } private ITicksInfo Clip(ITicksInfo ticks, Range range) { var newTicks = new List(ticks.Ticks.Length); var newSizes = new List(ticks.TickSizes.Length); for (int i = 0; i < ticks.Ticks.Length; i++) { T tick = ticks.Ticks[i]; if (IsInside(tick, range)) { newTicks.Add(tick); newSizes.Add(ticks.TickSizes[i]); } } return new TicksInfo { Ticks = newTicks.ToArray(), TickSizes = newSizes.ToArray(), Info = ticks.Info }; } protected abstract bool IsInside(T value, Range range); public int DecreaseTickCount(int ticksCount) { if (majorTicks.Length > 0) ticksCount /= majorTicks.Length; int minorTicksCount = provider.DecreaseTickCount(ticksCount); if (majorTicks.Length > 0) minorTicksCount *= majorTicks.Length; return minorTicksCount; } public int IncreaseTickCount(int ticksCount) { if (majorTicks.Length > 0) ticksCount /= majorTicks.Length; int minorTicksCount = provider.IncreaseTickCount(ticksCount); if (majorTicks.Length > 0) minorTicksCount *= majorTicks.Length; return minorTicksCount; } public ITicksProvider MinorProvider { get { return null; } } public ITicksProvider MajorProvider { get { return null; } } } }