Change toLowerCase() to toLowerCase(Locale.ENGLISH)
[debian/openrocket] / core / src / net / sf / openrocket / gui / scalefigure / ScaleSelector.java
1 package net.sf.openrocket.gui.scalefigure;
2
3 import java.awt.event.ActionEvent;
4 import java.awt.event.ActionListener;
5 import java.text.DecimalFormat;
6 import java.util.Arrays;
7 import java.util.EventObject;
8 import java.util.Locale;
9
10 import javax.swing.JButton;
11 import javax.swing.JComboBox;
12 import javax.swing.JPanel;
13
14 import net.miginfocom.swing.MigLayout;
15 import net.sf.openrocket.gui.util.Icons;
16 import net.sf.openrocket.util.StateChangeListener;
17
18 public class ScaleSelector extends JPanel {
19         
20         // Ready zoom settings
21         private static final DecimalFormat PERCENT_FORMAT = new DecimalFormat("0.#%");
22         
23         private static final double[] ZOOM_LEVELS = { 0.15, 0.25, 0.5, 0.75, 1.0, 1.5, 2.0 };
24         private static final String ZOOM_FIT = "Fit";
25         private static final String[] ZOOM_SETTINGS;
26         static {
27                 ZOOM_SETTINGS = new String[ZOOM_LEVELS.length + 1];
28                 for (int i = 0; i < ZOOM_LEVELS.length; i++)
29                         ZOOM_SETTINGS[i] = PERCENT_FORMAT.format(ZOOM_LEVELS[i]);
30                 ZOOM_SETTINGS[ZOOM_SETTINGS.length - 1] = ZOOM_FIT;
31         }
32         
33         
34         private final ScaleScrollPane scrollPane;
35         private JComboBox zoomSelector;
36         
37         
38         public ScaleSelector(ScaleScrollPane scroll) {
39                 super(new MigLayout());
40                 
41                 this.scrollPane = scroll;
42                 
43                 // Zoom out button
44                 JButton button = new JButton(Icons.ZOOM_OUT);
45                 button.addActionListener(new ActionListener() {
46                         @Override
47                         public void actionPerformed(ActionEvent e) {
48                                 double scale = scrollPane.getScaling();
49                                 scale = getPreviousScale(scale);
50                                 scrollPane.setScaling(scale);
51                         }
52                 });
53                 add(button, "gap");
54                 
55                 // Zoom level selector
56                 String[] settings = ZOOM_SETTINGS;
57                 if (!scrollPane.isFittingAllowed()) {
58                         settings = Arrays.copyOf(settings, settings.length - 1);
59                 }
60                 
61                 zoomSelector = new JComboBox(settings);
62                 zoomSelector.setEditable(true);
63                 setZoomText();
64                 zoomSelector.addActionListener(new ActionListener() {
65                         @Override
66                         public void actionPerformed(ActionEvent e) {
67                                 try {
68                                         String text = (String) zoomSelector.getSelectedItem();
69                                         text = text.replaceAll("%", "").trim();
70                                         
71                                         if (text.toLowerCase(Locale.getDefault()).startsWith(ZOOM_FIT.toLowerCase(Locale.getDefault())) &&
72                                                         scrollPane.isFittingAllowed()) {
73                                                 scrollPane.setFitting(true);
74                                                 setZoomText();
75                                                 return;
76                                         }
77                                         
78                                         double n = Double.parseDouble(text);
79                                         n /= 100;
80                                         if (n <= 0.005)
81                                                 n = 0.005;
82                                         
83                                         scrollPane.setScaling(n);
84                                         setZoomText();
85                                 } catch (NumberFormatException ignore) {
86                                 } finally {
87                                         setZoomText();
88                                 }
89                         }
90                 });
91                 scrollPane.getFigure().addChangeListener(new StateChangeListener() {
92                         @Override
93                         public void stateChanged(EventObject e) {
94                                 setZoomText();
95                         }
96                 });
97                 add(zoomSelector, "gap rel");
98                 
99                 
100                 // Zoom in button
101                 button = new JButton(Icons.ZOOM_IN);
102                 button.addActionListener(new ActionListener() {
103                         @Override
104                         public void actionPerformed(ActionEvent e) {
105                                 double scale = scrollPane.getScaling();
106                                 scale = getNextScale(scale);
107                                 scrollPane.setScaling(scale);
108                         }
109                 });
110                 add(button, "gapleft rel");
111                 
112         }
113         
114         
115         
116         private void setZoomText() {
117                 String text;
118                 double zoom = scrollPane.getScaling();
119                 text = PERCENT_FORMAT.format(zoom);
120                 if (scrollPane.isFitting()) {
121                         text = "Fit (" + text + ")";
122                 }
123                 if (!text.equals(zoomSelector.getSelectedItem()))
124                         zoomSelector.setSelectedItem(text);
125         }
126         
127         
128         
129         private double getPreviousScale(double scale) {
130                 int i;
131                 for (i = 0; i < ZOOM_LEVELS.length - 1; i++) {
132                         if (scale > ZOOM_LEVELS[i] + 0.05 && scale < ZOOM_LEVELS[i + 1] + 0.05)
133                                 return ZOOM_LEVELS[i];
134                 }
135                 if (scale > ZOOM_LEVELS[ZOOM_LEVELS.length / 2]) {
136                         // scale is large, drop to next lowest full 100%
137                         scale = Math.ceil(scale - 1.05);
138                         return Math.max(scale, ZOOM_LEVELS[i]);
139                 }
140                 // scale is small
141                 return scale / 1.5;
142         }
143         
144         
145         private double getNextScale(double scale) {
146                 int i;
147                 for (i = 0; i < ZOOM_LEVELS.length - 1; i++) {
148                         if (scale > ZOOM_LEVELS[i] - 0.05 && scale < ZOOM_LEVELS[i + 1] - 0.05)
149                                 return ZOOM_LEVELS[i + 1];
150                 }
151                 if (scale > ZOOM_LEVELS[ZOOM_LEVELS.length / 2]) {
152                         // scale is large, give next full 100%
153                         scale = Math.floor(scale + 1.05);
154                         return scale;
155                 }
156                 return scale * 1.5;
157         }
158         
159 }