/*******************************************************************************
* Copyright (c) MOBAC developers
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
******************************************************************************/
package mobac.gui.panels;
import java.awt.BorderLayout;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.ParseException;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import mobac.gui.components.FilledLayeredPane;
import mobac.gui.components.JCollapsiblePanel;
import mobac.gui.components.JCoordinateField;
import mobac.gui.components.JDropDownButton;
import mobac.program.interfaces.MapSource;
import mobac.program.model.CoordinateStringFormat;
import mobac.program.model.EastNorthCoordinate;
import mobac.program.model.MapSelection;
import mobac.program.model.MercatorPixelCoordinate;
import mobac.utilities.GBC;
import mobac.utilities.I18nUtils;
/**
* Encapsulates all interface components and code for the panel that shows the coordinates of the current selection and
* allows the user to enter own coordinates.
*/
public class JCoordinatesPanel extends JCollapsiblePanel {
private static final long serialVersionUID = 1L;
public static final String NAME = "Coordinates";//用于持久化
private JCoordinateField latMinTextField;
private JCoordinateField latMaxTextField;
private JCoordinateField lonMinTextField;
private JCoordinateField lonMaxTextField;
private JButton applySelectionButton;
private CoordinateStringFormat csf = CoordinateStringFormat.DEG_ENG;
public JCoordinatesPanel() {
super(I18nUtils.localizedStringForKey("lp_coords_title"), new GridBagLayout());
setName(NAME);
// coordinates panel
latMaxTextField = new JCoordinateField(MapSelection.LAT_MIN, MapSelection.LAT_MAX);
latMaxTextField.setActionCommand("latMaxTextField");
lonMinTextField = new JCoordinateField(MapSelection.LON_MIN, MapSelection.LON_MAX);
lonMinTextField.setActionCommand("longMinTextField");
lonMaxTextField = new JCoordinateField(MapSelection.LON_MIN, MapSelection.LON_MAX);
lonMaxTextField.setActionCommand("longMaxTextField");
latMinTextField = new JCoordinateField(MapSelection.LAT_MIN, MapSelection.LAT_MAX);
latMinTextField.setActionCommand("latMinTextField");
applySelectionButton = new JButton(I18nUtils.localizedStringForKey("lp_coords_select_btn_title"));
JLabel latMaxLabel = new JLabel(I18nUtils.localizedStringForKey("lp_coords_label_N"), JLabel.CENTER);
JLabel lonMinLabel = new JLabel(I18nUtils.localizedStringForKey("lp_coords_label_W"), JLabel.CENTER);
JLabel lonMaxLabel = new JLabel(I18nUtils.localizedStringForKey("lp_coords_label_E"), JLabel.CENTER);
JLabel latMinLabel = new JLabel(I18nUtils.localizedStringForKey("lp_coords_label_S"), JLabel.CENTER);
JPanel northPanel = new JPanel(new BorderLayout());
JLayeredPane layeredPane = new FilledLayeredPane();
JPanel northInnerPanel = new JPanel();
northInnerPanel.add(latMaxLabel);
northInnerPanel.add(latMaxTextField);
JPanel formatButtonPanel = new JPanel(null);
formatButtonPanel.setOpaque(false);
JDropDownButton formatButton = new JDropDownButton(I18nUtils.localizedStringForKey("lp_coords_fmt_list_title"));
formatButton.setMargin(new Insets(0, 5, 0, 0));
formatButton.setBounds(2, 2, 55, 20);
formatButtonPanel.add(formatButton);
for (CoordinateStringFormat csf : CoordinateStringFormat.values())
formatButton.addDropDownItem(new JNumberFormatMenuItem(csf));
layeredPane.add(northInnerPanel, Integer.valueOf(0));
layeredPane.setMinimumSize(northInnerPanel.getMinimumSize());
layeredPane.setPreferredSize(northInnerPanel.getPreferredSize());
layeredPane.add(formatButtonPanel, Integer.valueOf(2));
northPanel.add(layeredPane, BorderLayout.CENTER);
// northPanel.add(northInnerPanel, BorderLayout.CENTER);
contentContainer.add(northPanel, GBC.eol().fillH().insets(0, 5, 0, 0));
JPanel eastWestPanel = new JPanel(new GridBagLayout());
eastWestPanel.add(lonMinLabel, GBC.std());
eastWestPanel.add(lonMinTextField, GBC.std());
eastWestPanel.add(lonMaxLabel, GBC.std().insets(10, 0, 0, 0));
eastWestPanel.add(lonMaxTextField, GBC.std());
contentContainer.add(eastWestPanel, GBC.eol().fill());
JPanel southPanel = new JPanel();
southPanel.add(latMinLabel);
southPanel.add(latMinTextField);
contentContainer.add(southPanel, GBC.eol().anchor(GBC.CENTER));
contentContainer.add(applySelectionButton, GBC.eol().anchor(GBC.CENTER).insets(0, 5, 0, 0));
}
public void setNumberFormat(CoordinateStringFormat csf) {
this.csf = csf;
latMaxTextField.setNumberFormat(csf.getNumberFormatLatitude());
latMinTextField.setNumberFormat(csf.getNumberFormatLatitude());
lonMaxTextField.setNumberFormat(csf.getNumberFormatLongitude());
lonMinTextField.setNumberFormat(csf.getNumberFormatLongitude());
}
public CoordinateStringFormat getNumberFormat() {
return csf;
}
public void setCoordinates(EastNorthCoordinate max, EastNorthCoordinate min) {
latMaxTextField.setCoordinate(max.lat);
lonMaxTextField.setCoordinate(max.lon);
latMinTextField.setCoordinate(min.lat);
lonMinTextField.setCoordinate(min.lon);
}
public void setCoordinates(MapSelection ms) {
MercatorPixelCoordinate max = ms.getBottomRightPixelCoordinate();
MercatorPixelCoordinate min = ms.getTopLeftPixelCoordinate();
setSelection(max, min);
}
public void setSelection(MercatorPixelCoordinate max, MercatorPixelCoordinate min) {
EastNorthCoordinate c1 = min.getEastNorthCoordinate();
EastNorthCoordinate c2 = max.getEastNorthCoordinate();
latMaxTextField.setCoordinate(c1.lat);
lonMaxTextField.setCoordinate(c2.lon);
latMinTextField.setCoordinate(c2.lat);
lonMinTextField.setCoordinate(c1.lon);
}
/**
* Checks if the values for min/max langitude and min/max latitude are interchanged (smaller value in the max field
* and larger value in the min field) and swaps them if necessary.
*/
public void correctMinMax() {
try {
double lat1 = latMaxTextField.getCoordinate();
double lat2 = latMinTextField.getCoordinate();
if (lat1 < lat2) {
String tmp = latMaxTextField.getText();
latMaxTextField.setText(latMinTextField.getText());
latMinTextField.setText(tmp);
}
} catch (ParseException e) {
// one of the lat fields contains an invalid coordinate
}
try {
double lon1 = lonMaxTextField.getCoordinate();
double lon2 = lonMinTextField.getCoordinate();
if (lon1 < lon2) {
String tmp = lonMaxTextField.getText();
lonMaxTextField.setText(lonMinTextField.getText());
lonMinTextField.setText(tmp);
}
} catch (ParseException e) {
// one of the lon fields contains an invalid coordinate
}
}
public MapSelection getMapSelection(MapSource mapSource) {
EastNorthCoordinate max = getMaxCoordinate();
EastNorthCoordinate min = getMinCoordinate();
return new MapSelection(mapSource, max, min);
}
public EastNorthCoordinate getMaxCoordinate() {
return new EastNorthCoordinate(latMaxTextField.getCoordinateOrNaN(), lonMaxTextField.getCoordinateOrNaN());
}
public EastNorthCoordinate getMinCoordinate() {
return new EastNorthCoordinate(latMinTextField.getCoordinateOrNaN(), lonMinTextField.getCoordinateOrNaN());
}
public void addButtonActionListener(ActionListener l) {
applySelectionButton.addActionListener(l);
}
protected class JNumberFormatMenuItem extends JMenuItem implements ActionListener {
private static final long serialVersionUID = 1L;
private final CoordinateStringFormat csf;
public JNumberFormatMenuItem(CoordinateStringFormat csf) {
super(csf.toString());
this.csf = csf;
addActionListener(this);
}
public void actionPerformed(ActionEvent e) {
System.out.println(e);
JCoordinatesPanel.this.setNumberFormat(csf);
}
}
}