Initial commit
[debian/openrocket] / src / net / sf / openrocket / gui / scalefigure / AbstractScaleFigure.java
diff --git a/src/net/sf/openrocket/gui/scalefigure/AbstractScaleFigure.java b/src/net/sf/openrocket/gui/scalefigure/AbstractScaleFigure.java
new file mode 100644 (file)
index 0000000..5a515ba
--- /dev/null
@@ -0,0 +1,112 @@
+package net.sf.openrocket.gui.scalefigure;
+
+import java.awt.Color;
+import java.awt.Dimension;
+import java.util.LinkedList;
+import java.util.List;
+
+import javax.swing.JPanel;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+
+import net.sf.openrocket.util.Prefs;
+
+
+public abstract class AbstractScaleFigure extends JPanel implements ScaleFigure {
+
+       // Number of pixels to leave at edges when fitting figure
+       public static final int BORDER_PIXELS_WIDTH=30;
+       public static final int BORDER_PIXELS_HEIGHT=20;
+       
+       
+       protected final double dpi;
+
+       protected double scale = 1.0;
+       protected double scaling = 1.0;
+       
+       protected final List<ChangeListener> listeners = new LinkedList<ChangeListener>();
+       
+
+       public AbstractScaleFigure() {
+               this.dpi = Prefs.getDPI();
+               this.scaling = 1.0;
+               this.scale = dpi/0.0254*scaling;
+               
+               setBackground(Color.WHITE);
+               setOpaque(true);
+       }
+       
+       
+       
+       public abstract void updateFigure();
+       public abstract double getFigureWidth();
+       public abstract double getFigureHeight();
+       
+
+       @Override
+       public double getScaling() {
+               return scaling;
+       }
+
+       @Override
+       public double getAbsoluteScale() {
+               return scale;
+       }
+       
+       @Override
+       public void setScaling(double scaling) {
+               if (Double.isInfinite(scaling) || Double.isNaN(scaling))
+                       scaling = 1.0;
+               if (scaling < 0.001)
+                       scaling = 0.001;
+               if (scaling > 1000)
+                       scaling = 1000;
+               if (Math.abs(this.scaling - scaling) < 0.01)
+                       return;
+               this.scaling = scaling;
+               this.scale = dpi/0.0254*scaling;
+               updateFigure();
+       }
+       
+       @Override
+       public void setScaling(Dimension bounds) {
+               double zh = 1, zv = 1;
+               int w = bounds.width - 2*BORDER_PIXELS_WIDTH -20;
+               int h = bounds.height - 2*BORDER_PIXELS_HEIGHT -20;
+               
+               if (w < 10)
+                       w = 10;
+               if (h < 10)
+                       h = 10;
+               
+               zh = ((double)w) / getFigureWidth();
+               zv = ((double)h) / getFigureHeight();
+                       
+               double s = Math.min(zh, zv)/dpi*0.0254 - 0.001;
+               
+               setScaling(s);
+       }
+
+       
+
+       @Override
+       public void addChangeListener(ChangeListener listener) {
+               listeners.add(0,listener);
+       }
+
+       @Override
+       public void removeChangeListener(ChangeListener listener) {
+               listeners.remove(listener);
+       }
+       
+       private ChangeEvent changeEvent = null;
+       protected void fireChangeEvent() {
+               ChangeListener[] list = listeners.toArray(new ChangeListener[0]);
+               for (ChangeListener l: list) {
+                       if (changeEvent == null)
+                               changeEvent = new ChangeEvent(this);
+                       l.stateChanged(changeEvent);
+               }
+       }
+
+}