package timeflow.vis; import timeflow.data.db.*; import timeflow.data.time.*; import timeflow.model.*; import timeflow.vis.timeline.TimelineTrack; import java.awt.*; import java.util.*; import timeflow.util.*; public class VisualAct implements Comparable { Color color; String label; String mouseOver; double size = 1; String trackString; TimelineTrack track; boolean visible; Act act; int x, y; int spaceToRight; RoughTime start, end; int endX; public VisualAct(Act act) { this.act = act; } public int getX() { return x; } public int getDotR() { return Math.max(1, (int) Math.abs(size)); } public void setX(int x) { this.x = x; } public int getY() { return y; } public void setY(int y) { this.y = y; } public void draw(Graphics2D g, int ox, int oy, int r, Rectangle maxFill, boolean showDuration) { g.setColor(getColor()); if (size >= 0) { // Slow! g.fillOval(ox, y - r, 2 * r, 2 * r); } else { // Slow! g.drawOval(ox, y - r, 2 * r, 2 * r); } if (end != null && showDuration) { int lineY = y + 6; g.fillRect(getX(), lineY, getEndX() - getX(), 2); g.drawLine(getX(), lineY, getX(), lineY - 4); } } public Mouseover draw(Graphics2D g, Rectangle maxFill, Rectangle bounds, Display display, boolean text, boolean showDuration) { if (!isVisible()) { return null; } if (x > bounds.x + bounds.width && (end == null || endX > bounds.x + bounds.width) || x < bounds.x - 200 && (end == null || endX < bounds.x - 200)) { return null; } g.setFont(display.plain()); int r = getDotR(); if (r <= 0) { r = 1; } if (r > 30) { r = 30; } int ox = text ? x - 2 * r : x; draw(g, ox, y - 2, r, maxFill, showDuration); if (!text) { return new VisualActMouseover(ox - 2, y - r - 4, 4 + 2 * r, 4 + 2 * r); } int labelSpace = getSpaceToRight() - 12; int sw = 0; if (labelSpace > 50) { String s = display.format(getLabel(), labelSpace / 8, true); int n = s.indexOf(' '); int tx = x + 5; int ty = y + 4; if (n < 1) { g.drawString(s, tx, ty); } else { String first = s.substring(0, n); g.drawString(first, tx, ty); Color c = ColorUtils.interpolate(g.getColor(), Color.white, .33); g.setColor(c); g.drawString(s.substring(n), tx + display.plainFontMetrics().stringWidth(first), ty); } sw = display.plainFontMetrics().stringWidth(s); } return new VisualActMouseover(x - 3 - 2 * r, y - r - 8, 14 + sw, r + 13 + 2 * r); } public Act getAct() { return act; } public boolean isVisible() { return visible; } public void setVisible(boolean visible) { this.visible = visible; } public RoughTime getStart() { return start; } public void setStart(RoughTime start) { this.start = start; } public Color getColor() { return color; } public void setColor(Color color) { this.color = color; } public String getLabel() { return label; } public void setLabel(String label) { this.label = label; } public String getMouseOver() { return mouseOver; } public void setMouseOver(String mouseOver) { this.mouseOver = mouseOver; } public double getSize() { return size; } public void setSize(double size) { this.size = size; } public String getTrackString() { return trackString == null ? "" : trackString; } public void setTrackString(String track) { this.trackString = track; } public TimelineTrack getTrack() { return track; } public void setTrack(TimelineTrack track) { this.track = track; } public void setSpaceToRight(int spaceToRight) { this.spaceToRight = spaceToRight; } public int getSpaceToRight() { return spaceToRight; } public int getEndX() { return endX; } public void setEndX(int endX) { this.endX = endX; } public RoughTime getEnd() { return end; } public void setEnd(RoughTime end) { this.end = end; } @Override public int compareTo(Object o) { return RoughTime.compare(start, ((VisualAct) o).start); //start.compareTo(((VisualAct)o).start); } class VisualActMouseover extends Mouseover { public VisualActMouseover(int x, int y, int w, int h) { super(VisualAct.this, x, y, w, h); } public void draw(Graphics2D g, int maxW, int maxH, Display display) { super.draw(g, maxW, maxH, display); Act a = getAct(); ActDB db = a.getDB(); java.util.List fields = db.getFields(); ArrayList labels = new ArrayList(); int charWidth = 40; int numLines = 1; if (VisualAct.this instanceof GroupVisualAct) { GroupVisualAct gv = (GroupVisualAct) VisualAct.this; labels.add(gv.getNumActs() + ""); labels.add("items"); Field sizeField = db.getField(VirtualField.SIZE); if (sizeField != null) { labels.add("Total " + sizeField.getName()); double t = ((GroupVisualAct) (VisualAct.this)).total; labels.add(Display.format(t)); numLines++; } } else { for (Field f : fields) { labels.add(f.getName()); Object val = a.get(f); String valString = display.toString(val); if (f.getName().length() + valString.length() + 2 > charWidth) { ArrayList lines = Display.breakLines(valString, charWidth, 2 + f.getName().length()); labels.add(lines); numLines += lines.size() + 1; } else { labels.add(valString); numLines++; } } } draw(g, maxW, maxH, display, labels, numLines); } } }