package aimax.osm.gui.swing.viewer;
import java.text.DecimalFormat;
import java.util.Locale;
import javax.swing.BoxLayout;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
/**
* Simple panel for editing position information.
* @author Ruediger Lunde
*/
public class PositionPanel extends JPanel {
private static final long serialVersionUID = 1L;
JComboBox<String> latCombo;
JTextField latDegField;
JTextField latMinField;
JComboBox<String> lonCombo;
JTextField lonDegField;
JTextField lonMinField;
public PositionPanel() {
//setLayout(new GridLayout(2, 3));
setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
latCombo = new JComboBox<String>(new String[] {"N", "S"});
add(latCombo);
latDegField = new JTextField(3);
add(latDegField);
add(new JLabel('\u00B0' + " "));
latMinField = new JTextField(4);
add(latMinField);
add(new JLabel("' "));
lonCombo = new JComboBox<String>(new String[] {"E", "W"});
add(lonCombo);
lonDegField = new JTextField(3);
add(lonDegField);
add(new JLabel('\u00B0' + " "));
lonMinField = new JTextField(4);
add(lonMinField);
add(new JLabel("' "));
}
public void setEnabled(boolean state) {
super.setEnabled(state);
latCombo.setEnabled(state);
latDegField.setEnabled(state);
latMinField.setEnabled(state);
lonCombo.setEnabled(state);
lonDegField.setEnabled(state);
lonMinField.setEnabled(state);
}
public void setPosition(float lat, float lon) {
DecimalFormat f = new DecimalFormat("#0.000");
latCombo.setSelectedIndex(lat >= 0 ? 0 : 1);
latDegField.setText(Integer.toString(Math.abs((int) lat)));
latMinField.setText(f.format(Math.abs(lat-((int) lat))*60f));
lonCombo.setSelectedIndex(lon >= 0 ? 0 : 1);
lonDegField.setText(Integer.toString(Math.abs((int) lon)));
lonMinField.setText(f.format(Math.abs(lon-((int) lon))*60f));
}
/** Returns a latitude value or Float.NaN. */
public float getLat() {
return textToNumber(latCombo.getSelectedIndex(),
latDegField.getText(), latMinField.getText());
}
/** Returns a longitude value or Float.NaN. */
public float getLon() {
return textToNumber(lonCombo.getSelectedIndex(),
lonDegField.getText(), lonMinField.getText());
}
private float textToNumber(int selIdx, String deg, String min) {
float result;
try {
result = Float.parseFloat(deg);
if (!min.isEmpty())
result += Float.parseFloat(min) / 60f;
if (selIdx == 1)
result = -result;
} catch (NumberFormatException e) {
result = Float.NaN;
}
return result;
}
/** For testing... */
public static void main(String[] args) {
Locale.setDefault(Locale.US);
PositionPanel panel = new PositionPanel();
//panel.setEnabled(false);
panel.setPosition(50.5f, -30.9f);
int res = JOptionPane.showConfirmDialog(null, panel, "Specify a Position", JOptionPane.OK_CANCEL_OPTION);
if (res == JOptionPane.OK_OPTION) {
System.out.println(panel.getLat());
System.out.println(panel.getLon());
}
}
}