package timeflow.vis;
|
|
import timeflow.model.*;
|
|
import java.awt.*;
|
import java.util.ArrayList;
|
|
public class Mouseover extends Rectangle
|
{
|
public Object thing;
|
|
public Mouseover(Object thing, int x, int y, int w, int h)
|
{
|
super(x, y, w, h);
|
this.thing = thing;
|
}
|
|
public void draw(Graphics2D g, int maxW, int maxH, Display display)
|
{
|
g.setColor(new Color(0, 53, 153));
|
g.setColor(new Color(255, 255, 0, 100));
|
g.fill(this);
|
}
|
|
protected void draw(Graphics2D g, int maxW, int maxH, Display display, ArrayList labels, int numLines)
|
{
|
if (labels == null || labels.size() == 0)
|
{
|
return;
|
}
|
|
// draw a background box.
|
|
// find max number of chars, very very roughly!
|
int boxW = 50;
|
for (int i = 0; i < labels.size(); i += 2)
|
{
|
if (labels.get(i) instanceof String[])
|
{
|
boxW = 300;
|
} else if (labels.get(i) instanceof String)
|
{
|
boxW = Math.max(boxW, 50 + 50 * ((String) labels.get(i)).length());
|
}
|
}
|
|
|
boxW = Math.min(350, boxW);
|
int boxH = 18 * numLines + 10;
|
int mx = this.x + this.width + 5;
|
int my = this.y + this.height + 35;
|
|
// put box in a place where it does not obscure the data
|
// or go off screen.
|
if (my + boxH > maxH - 10)
|
{
|
my = Math.max(10, this.y - boxH - 5);
|
}
|
if (mx + boxW > maxW - 10)
|
{
|
mx = Math.max(10, this.x - boxW - 10);
|
}
|
int ty = my;
|
g.setColor(new Color(0, 0, 0, 70));
|
g.fillRoundRect(mx - 11, my - 16, boxW, boxH, 12, 12);
|
g.setColor(Color.white);
|
g.fillRoundRect(mx - 15, my - 20, boxW, boxH, 12, 12);
|
g.setColor(Color.darkGray);
|
g.drawRoundRect(mx - 15, my - 20, boxW, boxH, 12, 12);
|
|
// finally, draw the darn labels.
|
for (int i = 0; i < labels.size(); i += 2)
|
{
|
g.setFont(display.bold());
|
String field = (String) labels.get(i);
|
g.drawString(field, mx, ty);
|
int sw = display.boldFontMetrics().stringWidth(field);
|
g.setFont(display.plain());
|
Object o = labels.get(i + 1);
|
if (o instanceof String)
|
{
|
g.drawString((String) o, mx + sw + 9, ty);
|
ty += 18;
|
} else
|
{
|
ArrayList<String> lines = (ArrayList<String>) o;
|
int dx = sw + 9;
|
for (String line : lines)
|
{
|
g.drawString((String) line, mx + dx, ty);
|
ty += 18;
|
dx = 0;
|
}
|
ty += 5;
|
}
|
}
|
}
|
}
|