package timeflow.vis.timeline; import java.util.*; import timeflow.data.time.*; public class AxisTicMarks { public TimeUnit unit; public List tics; private static final TimeUnit[] units = { TimeUnit.YEAR, TimeUnit.MONTH, TimeUnit.DAY, TimeUnit.HOUR, TimeUnit.MINUTE, TimeUnit.SECOND }; private static final TimeUnit[] histUnits = { TimeUnit.YEAR.times(100), TimeUnit.YEAR.times(50), TimeUnit.YEAR.times(25), TimeUnit.YEAR.times(10), TimeUnit.YEAR.times(5), TimeUnit.YEAR.times(2), TimeUnit.YEAR, TimeUnit.MONTH.times(6), TimeUnit.MONTH.times(3), TimeUnit.MONTH.times(2), TimeUnit.MONTH, TimeUnit.WEEK, TimeUnit.DAY.times(2), TimeUnit.DAY, TimeUnit.HOUR, TimeUnit.MINUTE, TimeUnit.SECOND }; public AxisTicMarks(TimeUnit unit, long start, long end) { this.unit = unit; tics = new ArrayList(); RoughTime r = unit.roundDown(start); tics.add(r.getTime()); do { unit.addTo(r); tics.add(r.getTime()); } while (r.getTime() < end); } public static List allRelevant(Interval interval) { return allRelevant(interval.start, interval.end); } public static List allRelevant(long start, long end) { return allRelevant(start, end, 40); } public static AxisTicMarks histoTics(long start, long end) { for (int i = histUnits.length - 1; i >= 0; i--) { TimeUnit u = histUnits[i]; long estimate = u.approxNumInRange(start, end); if (estimate < 200 || i == 0) { AxisTicMarks t = new AxisTicMarks(u, start, end); return t; } } return null; } public static List allRelevant(long start, long end, long maxTics) { List list = new ArrayList(); for (int i = 0; i < units.length; i++) { TimeUnit u = units[i]; long estimate = u.approxNumInRange(start, end); if (estimate < maxTics) { AxisTicMarks t = new AxisTicMarks(u, start, end); if (list.size() > 0) { AxisTicMarks last = list.get(0); if (last.tics.size() == t.tics.size()) { list.remove(0); } } list.add(t); } } while (list.size() > 2) { list.remove(0); } if (list.size() == 0) // uh oh! must be many years. we will add in bigger increments. { long length = end - start; long size = 365 * 24 * 60 * 60 * 1000L; int m = 1; maxTics = 15; while (m < 2000000000 && length / (m * size) > maxTics) { if (length / (2 * m * size) <= maxTics) { m *= 2; break; } if (length / (5 * m * size) <= maxTics) { m *= 5; break; } m *= 10; } AxisTicMarks t = new AxisTicMarks(TimeUnit.multipleYears(m), start, end); list.add(t); } return list; } }