package timeflow.vis.timeline;
|
|
import java.awt.*;
|
import java.util.*;
|
|
import timeflow.data.time.Interval;
|
import timeflow.data.time.TimeUtils;
|
import timeflow.model.*;
|
import timeflow.vis.Mouseover;
|
import timeflow.vis.TimeScale;
|
|
public class AxisRenderer {
|
|
TimelineVisuals visuals;
|
|
public AxisRenderer(TimelineVisuals visuals)
|
{
|
this.visuals=visuals;
|
}
|
|
public void render(Graphics2D g, Collection<Mouseover> objectLocations)
|
{
|
TFModel model=visuals.getModel();
|
g.setColor(model.getDisplay().getColor("chart.background"));
|
Rectangle bounds=visuals.getBounds();
|
|
TimeScale scale=visuals.getTimeScale();
|
java.util.List<AxisTicMarks> t=AxisTicMarks.allRelevant(scale.getInterval());
|
|
int dateLabelH=model.getDisplay().getInt("timeline.datelabel.height");
|
int y=bounds.y+bounds.height-dateLabelH;
|
|
// draw in reverse order so bigger granularity at top.
|
int n=t.size();
|
for (int i=0; i<n; i++)
|
{
|
render(t.get(i), g, bounds.x, y, dateLabelH-1, bounds.y, i==0, objectLocations);
|
y-=dateLabelH;
|
}
|
}
|
|
void render(AxisTicMarks t, Graphics2D g, int x, int y, int h, int top, boolean full, Collection<Mouseover> objectLocations)
|
{
|
TFModel model=visuals.getModel();
|
|
int n=t.tics.size();
|
for (int i=0; i<n-1; i++)
|
{
|
|
long start=t.tics.get(i);
|
long end=t.tics.get(i+1);
|
|
int x0=Math.max(x,visuals.getTimeScale().toInt(start));
|
int x1=visuals.getTimeScale().toInt(end);
|
|
int dayOfWeek=TimeUtils.cal(start).get(Calendar.DAY_OF_WEEK);
|
|
g.setColor(t.unit.isDayOrLess() && (dayOfWeek==1 || dayOfWeek==7) ?
|
new Color(245,245,245) : new Color(240,240,240));
|
|
g.fillRect(x0, y, x1-x0-1, h);
|
g.setColor(Color.white);
|
g.drawLine(x1-1, y, x1-1, y+h);
|
g.drawLine(x0,y+h,x1,y+h);
|
objectLocations.add(new Mouseover(new Interval(start,end), x0, y, x1-x0-1, h));
|
|
g.setFont(model.getDisplay().timeLabel());
|
String label=full? t.unit.formatFull(start) : t.unit.format(new Date(start));
|
int tx=x0+3;
|
int ty=y+h-5;
|
g.setColor(full ? Color.darkGray : Color.gray);
|
int sw=model.getDisplay().timeLabelFontMetrics().stringWidth(label);
|
if (sw<x1-tx-3)
|
g.drawString(label, tx,ty);
|
else
|
{
|
int c=label.indexOf(':');
|
if (c>0)
|
{
|
label=label.substring(0,c);
|
sw=model.getDisplay().timeLabelFontMetrics().stringWidth(label);
|
if (sw<x1-tx-3)
|
g.drawString(label, tx,ty);
|
}
|
}
|
}
|
}
|
}
|