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() 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; i0) { 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; } }