package timeflow.vis.timeline;
|
|
import java.util.*;
|
|
import timeflow.data.time.*;
|
|
public class AxisTicMarks {
|
public TimeUnit unit;
|
public List<Long> 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<Long>();
|
RoughTime r=unit.roundDown(start);
|
tics.add(r.getTime());
|
do
|
{
|
unit.addTo(r);
|
tics.add(r.getTime());
|
} while (r.getTime()<end);
|
}
|
|
|
|
public static List<AxisTicMarks> allRelevant(Interval interval)
|
{
|
return allRelevant(interval.start, interval.end);
|
}
|
|
public static List<AxisTicMarks> 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<AxisTicMarks> allRelevant(long start, long end, long maxTics)
|
{
|
List<AxisTicMarks> list=new ArrayList<AxisTicMarks>();
|
|
|
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;
|
}
|
}
|