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 objectLocations) { TFModel model = visuals.getModel(); g.setColor(model.getDisplay().getColor("chart.background")); Rectangle bounds = visuals.getBounds(); TimeScale scale = visuals.getTimeScale(); java.util.List 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 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); } } } } } }