package timeflow.vis; import timeflow.data.db.*; import timeflow.model.*; import java.awt.Color; import java.util.*; public class VisualEncoder { private TFModel model; private java.util.List visualActs = new ArrayList(); private double maxSize = 0; public VisualEncoder(TFModel model) { this.model = model; } public java.util.List getVisualActs() { return visualActs; } public void createVisualActs() { Field colorField = model.getDB().getField(VirtualField.COLOR); Field trackField = model.getDB().getField(VirtualField.TRACK); boolean multipleColors = colorField != null && colorField.getType() == String[].class && colorField != trackField; visualActs = VisualActFactory.create(model.getDB().all(), trackField, multipleColors); Collections.sort(visualActs); } public List apply() { ActList visibleActs = model.getActs(); Field start = model.getDB().getField(VirtualField.START); Field end = model.getDB().getField(VirtualField.END); Field size = model.getDB().getField(VirtualField.SIZE); if (size != null) { double[] minmax = DBUtils.minmax(model.getActs(), size); maxSize = Math.max(Math.abs(minmax[0]), Math.abs(minmax[1])); } // apply color, label, visibility, etc. for (VisualAct v : visualActs) { Act a = v.getAct(); v.setStart(start == null ? null : a.getTime(start)); v.setEnd(end == null ? null : a.getTime(end)); v.setVisible(visibleActs.contains(a) && v.getStart() != null && v.getStart().isDefined()); apply(v); } return visualActs; } public void apply(VisualAct v) { Display display = model.getDisplay(); ActDB db = model.getDB(); Act a = v.getAct(); Field label = db.getField(VirtualField.LABEL); Field track = db.getField(VirtualField.TRACK); Field color = db.getField(VirtualField.COLOR); Field size = db.getField(VirtualField.SIZE); if (label == null) { v.setLabel(""); } else { v.setLabel(a.getString(label)); } double s = Display.MAX_DOT_SIZE; if (size == null || maxSize == 0) { v.setSize(s / 3); } else { double z = s * Math.sqrt(Math.abs(a.getValue(size)) / maxSize); if (a.getValue(size) < 0) { z = -z; } v.setSize(z); } // For setting the track: // This is a little complicated, but if the track is set to // tags (that is, track.getType()==String[].class) then // the track string was set earlier so it doesn't need to be set now. if (track == null) { v.setTrackString(""); } else if (track.getType() == String.class) { v.setTrackString(a.getString(track)); } if (color == null || color == track) { if (track == null) { v.setColor(display.getColor("timeline.unspecified.color")); } else { v.setColor(display.makeColor(v.getTrackString())); } } else { if (color.getType() == String[].class) { String[] tags = a.getTextList(color); if (tags == null || tags.length == 0) { ((TagVisualAct) v).setColors(new Color[0]); } else { int n = tags.length; Color[] c = new Color[n]; for (int i = 0; i < n; i++) { c[i] = display.makeColor(tags[i]); } ((TagVisualAct) v).setColors(c); } } else { v.setColor(display.makeColor(a.getString(color))); } } } }