package timeflow.app.ui; import timeflow.model.*; import timeflow.data.db.*; import timeflow.data.time.*; import timeflow.util.*; import java.awt.*; import java.awt.geom.AffineTransform; public class SizeLegendPanel extends ModelPanel { Field sizeField; double min, max; public SizeLegendPanel(TFModel model) { super(model); setBackground(Color.white); } @Override public void note(TFEvent e) { Field size=getModel().getDB().getField(VirtualField.SIZE); if (size!=null && (size!=sizeField || e.affectsData())) { double[] minmax=DBUtils.minmax(getModel().getActs(), size); min=minmax[0]; max=minmax[1]; } sizeField=size; repaint(); } public Dimension getPreferredSize() { return new Dimension(200,40); } public void paintComponent(Graphics g1) { Graphics2D g=(Graphics2D)g1; g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); int w=getSize().width; int h=getSize().height; TFModel model=getModel(); Display display=model.getDisplay(); g.setColor(getBackground()); g.setFont(display.plain()); g.fillRect(0,0,w,h); g.setColor(Color.gray); if (sizeField==null) { return; } else if (Double.isNaN(min)) { g.drawString("All values missing.",3,20); return; } else { AffineTransform old=g.getTransform(); g.setTransform(AffineTransform.getTranslateInstance(20, 0)); if (min==max) { g.setColor(Color.gray); g.fillOval(3,h/2-3,6,6); g.setColor(Color.black); g.setFont(display.tiny()); g.drawString(format(min),12,h/2+5); } else { String leftLabel=format(min); String rightLabel=format(max); g.setFont(display.tiny()); int lw=display.tinyFontMetrics().stringWidth(leftLabel); int rw=display.tinyFontMetrics().stringWidth(rightLabel); g.setColor(Color.black); int ty=h/2+5;; g.drawString(leftLabel,2,ty); g.setColor(Color.lightGray); double maxAbs=Math.max(Math.abs(min), Math.abs(max)); int dx=8+lw; for (int i=0; i<5; i++) { double z=(i*max+(4-i)*min)/4; int r=(int)(Math.sqrt(Math.abs(z/maxAbs))*Display.MAX_DOT_SIZE); if (r<1) r=1; if (z>0) g.fillOval(dx,h/2-r,2*r,2*r); else g.drawOval(dx,h/2-r,2*r,2*r); dx+=5+2*r; } g.setColor(Color.black); g.drawString(rightLabel,dx+4,ty); } g.setTransform(old); } } String format(double x) { if (Math.abs(x)>10 && (max-min)>10) return Display.format(Math.round(x)); return Display.format(x); } }