package org.jcae.viewer3d.post; import java.awt.*; import java.text.DecimalFormat; import javax.swing.JPanel; public class Legend extends JPanel { private boolean haveInfinity; private float min=0, max=1; private float minInf; private ColorMapper colorMapper=new DefaultColorMapper(); static class DoubleFormater { static DecimalFormat f1=new DecimalFormat("0.##E0"); static DecimalFormat f2=new DecimalFormat("##.##"); static String format(double d) { String s1=f1.format(d); String s2=f2.format(d); if(s1.length()>=s2.length() && !s2.equals("0") && !s2.equals("-0")) return s2; return s1; } } /** * */ public Legend() { setBackground(Color.BLACK); } /* (non-Javadoc) * @see java.awt.Component#getPreferredSize() */ @Override public Dimension getPreferredSize() { return new Dimension(100, 0); } public void setMin(float min) { this.min=min; } public void setMax(float max) { this.max=max; } public void setNegativeInfinity(boolean b) { haveInfinity=b; if(b) { minInf=min-(max-min)/10; } } /* (non-Javadoc) * @see javax.swing.JComponent#paint(java.awt.Graphics) */ @Override public void paint(Graphics g) { super.paint(g); if(min>max) return; Rectangle bnd = getBounds(); int margin=g.getFontMetrics().getHeight(); double d; for(int y=margin/2; y<bnd.height-margin/2; y++) { double f=(double)(y-margin/2)/(double)(bnd.height-margin); if(haveInfinity) { d=f*(minInf-max)+max; if(d<min) d=Float.NEGATIVE_INFINITY; } else { d=f*(min-max)+max; } g.setColor(colorMapper.mapColor((float) d)); g.drawLine(0, y, 25, y); if((y-margin/2)%(margin*2)==0) { String s; if(haveInfinity) { if(d<min) s="-\u221E"; else { s=DoubleFormater.format(d); } } else { s=DoubleFormater.format(d); } g.drawString(s, 35, y+margin/2); } } } public void setColorMapper(ColorMapper colorMapper) { this.colorMapper = colorMapper; } public boolean isHaveInfinity() { return haveInfinity; } public float getMax() { return max; } public float getMin() { return min; } }