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; } } } }