1 package net.sf.openrocket.gui.scalefigure;
4 import java.awt.Dimension;
5 import java.util.LinkedList;
8 import javax.swing.JPanel;
9 import javax.swing.event.ChangeEvent;
10 import javax.swing.event.ChangeListener;
12 import net.sf.openrocket.util.Prefs;
15 public abstract class AbstractScaleFigure extends JPanel implements ScaleFigure {
17 // Number of pixels to leave at edges when fitting figure
18 public static final int BORDER_PIXELS_WIDTH=30;
19 public static final int BORDER_PIXELS_HEIGHT=20;
22 protected final double dpi;
24 protected double scale = 1.0;
25 protected double scaling = 1.0;
27 protected final List<ChangeListener> listeners = new LinkedList<ChangeListener>();
30 public AbstractScaleFigure() {
31 this.dpi = Prefs.getDPI();
33 this.scale = dpi/0.0254*scaling;
35 setBackground(Color.WHITE);
41 public abstract void updateFigure();
42 public abstract double getFigureWidth();
43 public abstract double getFigureHeight();
47 public double getScaling() {
52 public double getAbsoluteScale() {
57 public void setScaling(double scaling) {
58 if (Double.isInfinite(scaling) || Double.isNaN(scaling))
64 if (Math.abs(this.scaling - scaling) < 0.01)
66 this.scaling = scaling;
67 this.scale = dpi/0.0254*scaling;
72 public void setScaling(Dimension bounds) {
73 double zh = 1, zv = 1;
74 int w = bounds.width - 2*BORDER_PIXELS_WIDTH -20;
75 int h = bounds.height - 2*BORDER_PIXELS_HEIGHT -20;
82 zh = ((double)w) / getFigureWidth();
83 zv = ((double)h) / getFigureHeight();
85 double s = Math.min(zh, zv)/dpi*0.0254 - 0.001;
93 public void addChangeListener(ChangeListener listener) {
94 listeners.add(0,listener);
98 public void removeChangeListener(ChangeListener listener) {
99 listeners.remove(listener);
102 private ChangeEvent changeEvent = null;
103 protected void fireChangeEvent() {
104 ChangeListener[] list = listeners.toArray(new ChangeListener[0]);
105 for (ChangeListener l: list) {
106 if (changeEvent == null)
107 changeEvent = new ChangeEvent(this);
108 l.stateChanged(changeEvent);