PageRenderTime 46ms CodeModel.GetById 19ms RepoModel.GetById 1ms app.codeStats 0ms

/Main/src/DynamicDataDisplay/Charts/Axes/DateTime/DateTimeTicksProvider.cs

#
C# | 307 lines | 249 code | 52 blank | 6 comment | 10 complexity | b1b893da38146e2d715a681e1cd84667 MD5 | raw file
Possible License(s): CC-BY-SA-3.0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Diagnostics;
  6. using System.Globalization;
  7. using Microsoft.Research.DynamicDataDisplay.Common.Auxiliary;
  8. namespace Microsoft.Research.DynamicDataDisplay.Charts
  9. {
  10. /// <summary>
  11. /// Represents a ticks provider for ticks of <see cref="T:System.DateTime"/> type.
  12. /// </summary>
  13. public class DateTimeTicksProvider : TimeTicksProviderBase<DateTime>
  14. {
  15. /// <summary>
  16. /// Initializes a new instance of the <see cref="DateTimeTicksProvider"/> class.
  17. /// </summary>
  18. public DateTimeTicksProvider() { }
  19. static DateTimeTicksProvider()
  20. {
  21. Providers.Add(DifferenceIn.Year, new YearDateTimeProvider());
  22. Providers.Add(DifferenceIn.Month, new MonthDateTimeProvider());
  23. Providers.Add(DifferenceIn.Day, new DayDateTimeProvider());
  24. Providers.Add(DifferenceIn.Hour, new HourDateTimeProvider());
  25. Providers.Add(DifferenceIn.Minute, new MinuteDateTimeProvider());
  26. Providers.Add(DifferenceIn.Second, new SecondDateTimeProvider());
  27. Providers.Add(DifferenceIn.Millisecond, new MillisecondDateTimeProvider());
  28. MinorProviders.Add(DifferenceIn.Year, new MinorDateTimeProvider(new YearDateTimeProvider()));
  29. MinorProviders.Add(DifferenceIn.Month, new MinorDateTimeProvider(new MonthDateTimeProvider()));
  30. MinorProviders.Add(DifferenceIn.Day, new MinorDateTimeProvider(new DayDateTimeProvider()));
  31. MinorProviders.Add(DifferenceIn.Hour, new MinorDateTimeProvider(new HourDateTimeProvider()));
  32. MinorProviders.Add(DifferenceIn.Minute, new MinorDateTimeProvider(new MinuteDateTimeProvider()));
  33. MinorProviders.Add(DifferenceIn.Second, new MinorDateTimeProvider(new SecondDateTimeProvider()));
  34. MinorProviders.Add(DifferenceIn.Millisecond, new MinorDateTimeProvider(new MillisecondDateTimeProvider()));
  35. }
  36. protected sealed override TimeSpan GetDifference(DateTime start, DateTime end)
  37. {
  38. return end - start;
  39. }
  40. }
  41. internal static class DateTimeArrayExtensions
  42. {
  43. internal static int GetIndex(this DateTime[] array, DateTime value)
  44. {
  45. for (int i = 0; i < array.Length - 1; i++)
  46. {
  47. if (array[i] <= value && value < array[i + 1])
  48. return i;
  49. }
  50. return array.Length - 1;
  51. }
  52. }
  53. internal sealed class MinorDateTimeProvider : MinorTimeProviderBase<DateTime>
  54. {
  55. public MinorDateTimeProvider(ITicksProvider<DateTime> owner) : base(owner) { }
  56. protected override bool IsInside(DateTime value, Range<DateTime> range)
  57. {
  58. return range.Min < value && value < range.Max;
  59. }
  60. }
  61. internal sealed class YearDateTimeProvider : DatePeriodTicksProvider
  62. {
  63. protected override DifferenceIn GetDifferenceCore()
  64. {
  65. return DifferenceIn.Year;
  66. }
  67. protected override int[] GetTickCountsCore()
  68. {
  69. return new int[] { 20, 10, 5, 4, 2, 1 };
  70. }
  71. protected override int GetSpecificValue(DateTime start, DateTime dt)
  72. {
  73. return dt.Year;
  74. }
  75. protected override DateTime GetStart(DateTime start, int value, int step)
  76. {
  77. int year = start.Year;
  78. int newYear = (year / step) * step;
  79. if (newYear == 0) newYear = 1;
  80. return new DateTime(newYear, 1, 1);
  81. }
  82. protected override bool IsMinDate(DateTime dt)
  83. {
  84. return dt.Year == DateTime.MinValue.Year;
  85. }
  86. protected override DateTime AddStep(DateTime dt, int step)
  87. {
  88. if (dt.Year + step > DateTime.MaxValue.Year)
  89. return DateTime.MaxValue;
  90. return dt.AddYears(step);
  91. }
  92. }
  93. internal sealed class MonthDateTimeProvider : DatePeriodTicksProvider
  94. {
  95. protected override DifferenceIn GetDifferenceCore()
  96. {
  97. return DifferenceIn.Month;
  98. }
  99. protected override int[] GetTickCountsCore()
  100. {
  101. return new int[] { 12, 6, 4, 3, 2, 1 };
  102. }
  103. protected override int GetSpecificValue(DateTime start, DateTime dt)
  104. {
  105. return dt.Month + (dt.Year - start.Year) * 12;
  106. }
  107. protected override DateTime GetStart(DateTime start, int value, int step)
  108. {
  109. return new DateTime(start.Year, 1, 1);
  110. }
  111. protected override bool IsMinDate(DateTime dt)
  112. {
  113. return dt.Month == DateTime.MinValue.Month;
  114. }
  115. protected override DateTime AddStep(DateTime dt, int step)
  116. {
  117. return dt.AddMonths(step);
  118. }
  119. }
  120. internal sealed class DayDateTimeProvider : DatePeriodTicksProvider
  121. {
  122. protected override DifferenceIn GetDifferenceCore()
  123. {
  124. return DifferenceIn.Day;
  125. }
  126. protected override int[] GetTickCountsCore()
  127. {
  128. return new int[] { 30, 15, 10, 5, 2, 1 };
  129. }
  130. protected override int GetSpecificValue(DateTime start, DateTime dt)
  131. {
  132. return (dt - start).Days;
  133. }
  134. protected override DateTime GetStart(DateTime start, int value, int step)
  135. {
  136. return start.Date;
  137. }
  138. protected override bool IsMinDate(DateTime dt)
  139. {
  140. return dt.Day == 1;
  141. }
  142. protected override DateTime AddStep(DateTime dt, int step)
  143. {
  144. return dt.AddDays(step);
  145. }
  146. }
  147. internal sealed class HourDateTimeProvider : DatePeriodTicksProvider
  148. {
  149. protected override DifferenceIn GetDifferenceCore()
  150. {
  151. return DifferenceIn.Hour;
  152. }
  153. protected override int[] GetTickCountsCore()
  154. {
  155. return new int[] { 24, 12, 6, 4, 3, 2, 1 };
  156. }
  157. protected override int GetSpecificValue(DateTime start, DateTime dt)
  158. {
  159. return (int)(dt - start).TotalHours;
  160. }
  161. protected override DateTime GetStart(DateTime start, int value, int step)
  162. {
  163. return start.Date;
  164. }
  165. protected override bool IsMinDate(DateTime dt)
  166. {
  167. return false;
  168. }
  169. protected override DateTime AddStep(DateTime dt, int step)
  170. {
  171. return dt.AddHours(step);
  172. }
  173. }
  174. internal sealed class MinuteDateTimeProvider : DatePeriodTicksProvider
  175. {
  176. protected override DifferenceIn GetDifferenceCore()
  177. {
  178. return DifferenceIn.Minute;
  179. }
  180. protected override int[] GetTickCountsCore()
  181. {
  182. return new int[] { 60, 30, 20, 15, 10, 5, 4, 3, 2 };
  183. }
  184. protected override int GetSpecificValue(DateTime start, DateTime dt)
  185. {
  186. return (int)(dt - start).TotalMinutes;
  187. }
  188. protected override DateTime GetStart(DateTime start, int value, int step)
  189. {
  190. return start.Date.AddHours(start.Hour);
  191. }
  192. protected override bool IsMinDate(DateTime dt)
  193. {
  194. return false;
  195. }
  196. protected override DateTime AddStep(DateTime dt, int step)
  197. {
  198. return dt.AddMinutes(step);
  199. }
  200. }
  201. internal sealed class SecondDateTimeProvider : DatePeriodTicksProvider
  202. {
  203. protected override DifferenceIn GetDifferenceCore()
  204. {
  205. return DifferenceIn.Second;
  206. }
  207. protected override int[] GetTickCountsCore()
  208. {
  209. return new int[] { 60, 30, 20, 15, 10, 5, 4, 3, 2 };
  210. }
  211. protected override int GetSpecificValue(DateTime start, DateTime dt)
  212. {
  213. return (int)(dt - start).TotalSeconds;
  214. }
  215. protected override DateTime GetStart(DateTime start, int value, int step)
  216. {
  217. return start.Date.AddHours(start.Hour).AddMinutes(start.Minute);
  218. }
  219. protected override bool IsMinDate(DateTime dt)
  220. {
  221. return false;
  222. }
  223. protected override DateTime AddStep(DateTime dt, int step)
  224. {
  225. return dt.AddSeconds(step);
  226. }
  227. }
  228. internal sealed class MillisecondDateTimeProvider : DatePeriodTicksProvider
  229. {
  230. protected override DifferenceIn GetDifferenceCore()
  231. {
  232. return DifferenceIn.Millisecond;
  233. }
  234. protected override int[] GetTickCountsCore()
  235. {
  236. return new int[] { 100, 50, 40, 25, 20, 10, 5, 4, 2 };
  237. }
  238. protected override int GetSpecificValue(DateTime start, DateTime dt)
  239. {
  240. return (int)(dt - start).TotalMilliseconds;
  241. }
  242. protected override DateTime GetStart(DateTime start, int value, int step)
  243. {
  244. return start.Date.AddHours(start.Hour).AddMinutes(start.Minute).AddSeconds(start.Second);
  245. }
  246. protected override bool IsMinDate(DateTime dt)
  247. {
  248. return false;
  249. }
  250. protected override DateTime AddStep(DateTime dt, int step)
  251. {
  252. return dt.AddMilliseconds(step);
  253. }
  254. }
  255. }