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); } } } } }