package jas.plot; import java.awt.CardLayout; import java.awt.Component; import java.awt.Graphics; import java.util.Vector; import javax.swing.JComponent; public class DataArea extends MovableObject { public DataArea(final Axis x, final Axis y) { this(); //xAxis = x; //yAxis[0] = y; add(x,DataAreaLayout.X_AXIS); add(y,DataAreaLayout.Y_AXIS_LEFT); } public DataArea() { super("Data Area"); normal = new NormalDataArea(); setLayout(cardLayout = new CardLayout()); super.add(normal,"Normal"); // Use "jas.plot.usePG2" property to switch between PG2 settings // Default is PG2_ALWAYS String usePG2Property = System.getProperty("jas.plot.usePG2", "true"); if (usePG2Property.equalsIgnoreCase("false") || usePG2Property.equalsIgnoreCase("never") ) usePG2(PG2_NEVER); else if (usePG2Property.equalsIgnoreCase("printing") ) usePG2(PG2_PRINTING); else usePG2(PG2_ALWAYS); } public void add(final Axis a, final Object constraint) { if (a == null) return; // safe to use == instead of .equals() ? if (constraint == DataAreaLayout.X_AXIS) { if (xAxis != null) remove(xAxis); xAxis = a; } else if (constraint == DataAreaLayout.Y_AXIS_LEFT) { if (yAxis[0] != null) remove(yAxis[0]); yAxis[0] = a; } else if (constraint == DataAreaLayout.Y_AXIS_RIGHT) { if (yAxis[1] != null) remove(yAxis[1]); yAxis[1] = a; } normal.add(a, constraint); } public void add(final EditableLabel a, final Object constraint) { if (a == null) return; // safe to use == instead of .equals() ? if (constraint == DataAreaLayout.X_AXIS_LABEL) { if (xAxisLabel != null) remove(xAxisLabel); xAxisLabel = a; } else if (constraint == DataAreaLayout.Y_AXIS_LEFT_LABEL) { if (yAxisLabel[0] != null) remove(yAxisLabel[0]); yAxisLabel[0] = a; } else if (constraint == DataAreaLayout.Y_AXIS_RIGHT_LABEL) { if (yAxisLabel[1] != null) remove(yAxisLabel[1]); yAxisLabel[1] = a; } normal.add(a, constraint); } public void add(final Overlay o) { overlays.addElement(o); o.containerNotify(normal); } public void setSpecialComponent(Component special) { if (special == this.special) return; if (special == null) { cardLayout.first(this); super.remove(this.special); this.special = null; } else { super.add(special,"Special"); cardLayout.last(this); if (this.special != null) super.remove(this.special); this.special = special; } } public void remove(final Component c) { if (c == xAxis) xAxis = null; else if (c == yAxis[0]) yAxis[0] = null; else if (c == yAxis[1]) yAxis[1] = null; else if (c == xAxisLabel) xAxisLabel = null; else if (c == yAxisLabel[0]) yAxisLabel[0] = null; else if (c == yAxisLabel[1]) yAxisLabel[1] = null; normal.remove(c); } public Axis getXAxis() { return xAxis; } public Axis getYAxis() { return yAxis[0]; } public Axis getYAxis(final int index) { return yAxis[index]; } public void remove(final Overlay o) { overlays.removeElement(o); o.containerNotify(null); } public EditableLabel getLabel(final Axis a) { if (a == xAxis) return xAxisLabel; if (a == yAxis[0]) return yAxisLabel[0]; if (a == yAxis[1]) return yAxisLabel[1]; return null; } public void setLabel(final Axis a, final EditableLabel l) { if (a == xAxis ) add(l,DataAreaLayout.X_AXIS_LABEL); else if (a == yAxis[0]) add(l,DataAreaLayout.Y_AXIS_LEFT_LABEL); else if (a == yAxis[1]) add(l,DataAreaLayout.Y_AXIS_RIGHT_LABEL); } /** * Set the mode for using JDK 1.2 graphics (call has no effect if running under JDK 1.1) * @param mode One of PG2_NEVER, PG2_PRINTING, PG2_ALWAYS */ public void usePG2(int mode) { if (mode != PG2_NEVER && pg2 == null) { try { Class c = Class.forName("jas.plot.java2.PlotGraphics12"); pg2 = (SetablePlotGraphics) c.newInstance(); } catch (Throwable x) { //x.printStackTrace(); usepg2 = PG2_NEVER; return; } } if (usepg2 != mode) { usepg2 = mode; repaint(); } } private final Vector overlays = new Vector(); /** Never use JDK 1.2 graphics */ public final static int PG2_NEVER = 0; /** Use JDK 1.2 graphics only when printing */ public final static int PG2_PRINTING = 1; /** Use JDK 1.2 graphics always */ public final static int PG2_ALWAYS = 2; private int usepg2 = PG2_NEVER; private NormalDataArea normal; private Component special; private CardLayout cardLayout; private SetablePlotGraphics pg2; private SetablePlotGraphics pg1 = new jas.plot.java1.PlotGraphics11(); private Axis xAxis; private final Axis[] yAxis = new Axis[2]; private EditableLabel xAxisLabel; private final EditableLabel[] yAxisLabel = new EditableLabel[2]; private class NormalDataArea extends JComponent implements OverlayContainer { NormalDataArea() { setLayout(new DataAreaLayout()); } public void print(Graphics g) { try { printing = true; super.print(g); super.invalidate(); } finally { printing = false; } } public void paintChildren(final Graphics g) { // Painting the contents of a plot can occasionally throw an exception // (due to bugs!) which has the undesirable effect of causing painting // of the entire UI to get confused, so here we will catch any exceptions // and continue with painting the rest of the UI boolean pg2now = (usepg2 == PG2_ALWAYS) || (usepg2 == PG2_PRINTING && isPrinting()); SetablePlotGraphics pg = pg2now ? pg2 : pg1; try { //long start = System.currentTimeMillis(); super.paintChildren(g); pg.setGraphics(g); xAxis.paint(pg); if (yAxis[0] != null) yAxis[0].paint(pg); if (yAxis[1] != null) yAxis[1].paint(pg); pg.setClip(xAxis.getMinLocation(),xAxis.getMaxLocation(),yAxis[0].getMinLocation(),yAxis[0].getMaxLocation()); for (int i=0,s=overlays.size(); i<s; i++) { pg.clearTransformation(); Overlay o = (Overlay) overlays.elementAt(i); o.paint(pg, isPrinting()); } //long stop = System.currentTimeMillis(); //System.out.println("paint ["+nPaint+++"] took "+(stop-start)+"ms clip="+g.getClip()); } catch (Throwable t) { System.err.println("Exception while painting DataArea"); t.printStackTrace(); } finally { pg.setGraphics(null); // protect against memory leak } } public CoordinateTransformation getXTransformation() { return xAxis.type.getCoordinateTransformation(); } public CoordinateTransformation getYTransformation() { return yAxis[0].type.getCoordinateTransformation(); } public CoordinateTransformation getYTransformation(final int index) { return yAxis[index].type.getCoordinateTransformation(); } private boolean isPrinting() { return printing || PrintHelper.isPrinting(); } private boolean printing; } //private static int nPaint = 0; }