// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.gui.preferences.projection;
import static org.openstreetmap.josm.tools.I18n.tr;
import java.awt.GridBagLayout;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import javax.swing.ButtonGroup;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import org.openstreetmap.josm.Main;
import org.openstreetmap.josm.tools.GBC;
public class UTMProjectionChoice extends ListProjectionChoice {
/** Earth emispheres **/
public enum Hemisphere {
/** North emisphere */
North,
/** South emisphere */
South
}
private static final Hemisphere DEFAULT_HEMISPHERE = Hemisphere.North;
private Hemisphere hemisphere;
private static final List<String> cbEntries = new ArrayList<>();
static {
for (int i = 1; i <= 60; i++) {
cbEntries.add(Integer.toString(i));
}
}
/**
* Constructs a new {@code UTMProjectionChoice}.
*/
public UTMProjectionChoice() {
super(tr("UTM"), /* NO-ICON */ "core:utm", cbEntries.toArray(new String[cbEntries.size()]), tr("UTM Zone"));
}
private class UTMPanel extends CBPanel {
public JRadioButton north, south;
UTMPanel(String[] entries, int initialIndex, String label, ActionListener listener) {
super(entries, initialIndex, label, listener);
north = new JRadioButton();
north.setSelected(hemisphere == Hemisphere.North);
south = new JRadioButton();
south.setSelected(hemisphere == Hemisphere.South);
ButtonGroup group = new ButtonGroup();
group.add(north);
group.add(south);
JPanel bPanel = new JPanel(new GridBagLayout());
bPanel.add(new JLabel(tr("North")), GBC.std().insets(5, 5, 0, 5));
bPanel.add(north, GBC.std().fill(GBC.HORIZONTAL));
bPanel.add(GBC.glue(1, 0), GBC.std().fill(GBC.HORIZONTAL));
bPanel.add(new JLabel(tr("South")), GBC.std().insets(5, 5, 0, 5));
bPanel.add(south, GBC.std().fill(GBC.HORIZONTAL));
bPanel.add(GBC.glue(1, 1), GBC.eol().fill(GBC.BOTH));
this.add(new JLabel(tr("Hemisphere")), GBC.std().insets(5, 5, 0, 5));
this.add(GBC.glue(1, 0), GBC.std().fill(GBC.HORIZONTAL));
this.add(bPanel, GBC.eop().fill(GBC.HORIZONTAL));
this.add(GBC.glue(1, 1), GBC.eol().fill(GBC.BOTH));
if (listener != null) {
north.addActionListener(listener);
south.addActionListener(listener);
}
}
}
@Override
public JPanel getPreferencePanel(ActionListener listener) {
return new UTMPanel(entries, index, label, listener);
}
@Override
public String getCurrentCode() {
int zone = index + 1;
int code = 32600 + zone + (hemisphere == Hemisphere.South ? 100 : 0);
return "EPSG:" + Integer.toString(code);
}
@Override
public String getProjectionName() {
return tr("UTM");
}
@Override
public Collection<String> getPreferences(JPanel panel) {
if (!(panel instanceof UTMPanel)) {
throw new IllegalArgumentException("Unsupported panel: "+panel);
}
UTMPanel p = (UTMPanel) panel;
int idx = p.prefcb.getSelectedIndex();
Hemisphere hem = p.south.isSelected() ? Hemisphere.South : Hemisphere.North;
return Arrays.asList(indexToZone(idx), hem.toString());
}
@Override
public String[] allCodes() {
List<String> projections = new ArrayList<>(60*4);
for (int zone = 1; zone <= 60; zone++) {
for (Hemisphere hem : Hemisphere.values()) {
projections.add("EPSG:" + (32600 + zone + (hem == Hemisphere.South ? 100 : 0)));
}
}
return projections.toArray(new String[projections.size()]);
}
@Override
public Collection<String> getPreferencesFromCode(String code) {
if (code.startsWith("EPSG:326") || code.startsWith("EPSG:327")) {
try {
Hemisphere hem = code.charAt(7) == '6' ? Hemisphere.North : Hemisphere.South;
String zonestring = code.substring(8);
int zoneval = Integer.parseInt(zonestring);
if (zoneval > 0 && zoneval <= 60)
return Arrays.asList(zonestring, hem.toString());
} catch (NumberFormatException e) {
Main.warn(e);
}
}
return null;
}
@Override
public void setPreferences(Collection<String> args) {
super.setPreferences(args);
Hemisphere hem = DEFAULT_HEMISPHERE;
if (args != null) {
String[] array = args.toArray(new String[args.size()]);
if (array.length > 1) {
hem = Hemisphere.valueOf(array[1]);
}
}
this.hemisphere = hem;
}
@Override
protected String indexToZone(int idx) {
return Integer.toString(idx + 1);
}
@Override
protected int zoneToIndex(String zone) {
try {
return Integer.parseInt(zone) - 1;
} catch (NumberFormatException e) {
Main.warn(e);
}
return defaultIndex;
}
}