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)
g.fillOval(ox,y-r,2*r,2*r);
else
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<Field> 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<String> 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);
}
}
}