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<VisualAct> visualActs=new ArrayList<VisualAct>();
private double maxSize=0;
public VisualEncoder(TFModel model)
{
this.model=model;
}
public java.util.List<VisualAct> 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<VisualAct> 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)));
}
}
}