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 private static final int DEFAULT_BORDER_PIXELS_WIDTH = 30;
19 private static final int DEFAULT_BORDER_PIXELS_HEIGHT = 20;
22 protected final double dpi;
24 protected double scale = 1.0;
25 protected double scaling = 1.0;
27 protected int borderPixelsWidth = DEFAULT_BORDER_PIXELS_WIDTH;
28 protected int borderPixelsHeight = DEFAULT_BORDER_PIXELS_HEIGHT;
30 protected final List<ChangeListener> listeners = new LinkedList<ChangeListener>();
33 public AbstractScaleFigure() {
34 this.dpi = Prefs.getDPI();
36 this.scale = dpi / 0.0254 * scaling;
38 setBackground(Color.WHITE);
44 public abstract void updateFigure();
46 public abstract double getFigureWidth();
48 public abstract double getFigureHeight();
52 public double getScaling() {
57 public double getAbsoluteScale() {
62 public void setScaling(double scaling) {
63 if (Double.isInfinite(scaling) || Double.isNaN(scaling))
69 if (Math.abs(this.scaling - scaling) < 0.01)
71 this.scaling = scaling;
72 this.scale = dpi / 0.0254 * scaling;
77 public void setScaling(Dimension bounds) {
78 double zh = 1, zv = 1;
79 int w = bounds.width - 2 * borderPixelsWidth - 20;
80 int h = bounds.height - 2 * borderPixelsHeight - 20;
87 zh = (w) / getFigureWidth();
88 zv = (h) / getFigureHeight();
90 double s = Math.min(zh, zv) / dpi * 0.0254 - 0.001;
97 public Dimension getBorderPixels() {
98 return new Dimension(borderPixelsWidth, borderPixelsHeight);
102 public void setBorderPixels(int width, int height) {
103 this.borderPixelsWidth = width;
104 this.borderPixelsHeight = height;
109 public void addChangeListener(ChangeListener listener) {
110 listeners.add(0, listener);
114 public void removeChangeListener(ChangeListener listener) {
115 listeners.remove(listener);
118 private ChangeEvent changeEvent = null;
120 protected void fireChangeEvent() {
121 ChangeListener[] list = listeners.toArray(new ChangeListener[0]);
122 for (ChangeListener l : list) {
123 if (changeEvent == null)
124 changeEvent = new ChangeEvent(this);
125 l.stateChanged(changeEvent);