5a515ba765e15d1155dad79ed7632721e1ddbde4
[debian/openrocket] / src / net / sf / openrocket / gui / scalefigure / AbstractScaleFigure.java
1 package net.sf.openrocket.gui.scalefigure;
2
3 import java.awt.Color;
4 import java.awt.Dimension;
5 import java.util.LinkedList;
6 import java.util.List;
7
8 import javax.swing.JPanel;
9 import javax.swing.event.ChangeEvent;
10 import javax.swing.event.ChangeListener;
11
12 import net.sf.openrocket.util.Prefs;
13
14
15 public abstract class AbstractScaleFigure extends JPanel implements ScaleFigure {
16
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;
20         
21         
22         protected final double dpi;
23
24         protected double scale = 1.0;
25         protected double scaling = 1.0;
26         
27         protected final List<ChangeListener> listeners = new LinkedList<ChangeListener>();
28         
29
30         public AbstractScaleFigure() {
31                 this.dpi = Prefs.getDPI();
32                 this.scaling = 1.0;
33                 this.scale = dpi/0.0254*scaling;
34                 
35                 setBackground(Color.WHITE);
36                 setOpaque(true);
37         }
38         
39         
40         
41         public abstract void updateFigure();
42         public abstract double getFigureWidth();
43         public abstract double getFigureHeight();
44         
45
46         @Override
47         public double getScaling() {
48                 return scaling;
49         }
50
51         @Override
52         public double getAbsoluteScale() {
53                 return scale;
54         }
55         
56         @Override
57         public void setScaling(double scaling) {
58                 if (Double.isInfinite(scaling) || Double.isNaN(scaling))
59                         scaling = 1.0;
60                 if (scaling < 0.001)
61                         scaling = 0.001;
62                 if (scaling > 1000)
63                         scaling = 1000;
64                 if (Math.abs(this.scaling - scaling) < 0.01)
65                         return;
66                 this.scaling = scaling;
67                 this.scale = dpi/0.0254*scaling;
68                 updateFigure();
69         }
70         
71         @Override
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;
76                 
77                 if (w < 10)
78                         w = 10;
79                 if (h < 10)
80                         h = 10;
81                 
82                 zh = ((double)w) / getFigureWidth();
83                 zv = ((double)h) / getFigureHeight();
84                         
85                 double s = Math.min(zh, zv)/dpi*0.0254 - 0.001;
86                 
87                 setScaling(s);
88         }
89
90         
91
92         @Override
93         public void addChangeListener(ChangeListener listener) {
94                 listeners.add(0,listener);
95         }
96
97         @Override
98         public void removeChangeListener(ChangeListener listener) {
99                 listeners.remove(listener);
100         }
101         
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);
109                 }
110         }
111
112 }