package timeflow.vis.timeline; import timeflow.vis.VisualAct; import timeflow.data.time.*; import timeflow.util.*; import java.util.*; public class TimelineTrack implements Comparable { String label; List visualActs = new ArrayList(); int y0, y1; DoubleBag histogram; TimelineTrack(String label) { this.label = label; } void add(VisualAct v) { visualActs.add(v); } int size() { return visualActs.size(); } // assumes a>b>0 int gcd(int a, int b) { int mod = a % b; if (mod == 0) { return b; } return gcd(b, mod); } int nearAndRelPrime(int target, int modulus) { if (target < 2) { return 1; } while (gcd(modulus, target) > 1) { target--; } return target; } // top and height are in proportion of total height of frame. void layout(double top, double height, TimelineVisuals visuals) { int n = visualActs.size(); if (n == 0) { return; } int labelHeight = 0; // 80; int fh = visuals.getBounds().height - labelHeight; int fy = visuals.getBounds().y; int cellH = visuals.getModel().getDisplay().getInt("timeline.item.height.min"); int fontHeight = 12; y0 = fy + (int) (fh * top); y1 = fy + (int) (fh * (top + height)); //int mid = (y0 + y1) / 2; int iy0 = y0; // Math.min(y0 + 5, mid); int iy1 = y1; // Math.max(y1 - 15, mid); int numCells = Math.max(1, (iy1 - iy0) / cellH); VisualAct[] rights = new VisualAct[numCells]; int step = nearAndRelPrime((int) (.61803399 * numCells), numCells); int i = 0; VisualAct last = null; for (VisualAct v : visualActs) { if (!v.isVisible() || !v.getTrack().equals(this)) { continue; } v.setSpaceToRight(1000); double num = visuals.getTimeScale().toNum(v.getStart().getTime()); int x = (int) num; int cell = numCells < 2 ? 0 : (i % numCells); int y = iy0 + cell * cellH; // (iy1 - iy0 < 12 ? 0 : cell * cellH); v.setX(x); v.setY(y + fontHeight); if (v.getEnd() != null) { v.setEndX((int) visuals.getTimeScale().toNum(v.getEnd().getTime())); } if (rights[cell] != null) { int space = x - rights[cell].getX(); rights[cell].setSpaceToRight(space); } rights[cell] = v; if ((last != null && v.getStart().getTime() == last.getStart().getTime()) || visuals.getLayoutStyle() == TimelineVisuals.Layout.TIGHT) { i++; } else { i += step; } last = v; } } @Override public int compareTo(Object o) { return ((TimelineTrack) o).size() - size(); } }