/*******************************************************************************
* Copyright (c) 2014 Open Door Logistics (www.opendoorlogistics.com)
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser Public License v3
* which accompanies this distribution, and is available at http://www.gnu.org/licenses/lgpl.txt
******************************************************************************/
package com.opendoorlogistics.studio.components.geocoder;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.AbstractAction;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
import com.opendoorlogistics.api.ui.UIFactory.TextChangedListener;
import com.opendoorlogistics.core.utils.ui.TextEntryPanel;
import com.opendoorlogistics.core.utils.ui.VerticalLayoutPanel;
import com.opendoorlogistics.studio.components.geocoder.model.GeocodeAverageType;
import com.opendoorlogistics.studio.components.geocoder.model.GeocodeModel;
import com.opendoorlogistics.studio.components.geocoder.model.GeocodeModelListener;
final public class GeocodeItemPanel extends VerticalLayoutPanel implements GeocodeModelListener {
private final TextEntryPanel address;
private final TextEntryPanel lat;
private final TextEntryPanel lng;
private final GeocodeModel model;
private final JButton setButton;
private boolean isReadingFromForm;
public GeocodeItemPanel(final GeocodeModel model) {
this.model = model;
TextChangedListener listener = new TextChangedListener() {
@Override
public void textChange(String newText) {
readFromForm();
}
};
address = new TextEntryPanel(null, "", null, listener);
address.setPreferredTextboxWidth(500);
address.setMaximumSize(new Dimension(500, 40));
JButton resetAddress = new JButton("Reset");
resetAddress.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
model.resetAddress();
}
});
addLine(Box.createRigidArea(new Dimension()),
new JLabel("Address"),address,Box.createRigidArea(new Dimension(6, 1)),resetAddress,Box.createHorizontalGlue() );
// addLine(address,Box.createHorizontalStrut(6), resetAddress, Box.createHorizontalGlue());
lat = new TextEntryPanel(null, "0", null, listener);
lng = new TextEntryPanel(null, "0", null, listener);
lat.setPreferredTextboxWidth(150);
lng.setPreferredTextboxWidth(150);
// set max size on lat and long so the box layout manager can properly position them
lat.setMaximumSize(new Dimension(100, 40));
lng.setMaximumSize(new Dimension(100, 40));
JButton clearButton = new JButton(new AbstractAction("Clear"){
@Override
public void actionPerformed(ActionEvent e) {
model.setGeocode(null, null);
}
});
clearButton.setToolTipText("Clear the current geocode");
setButton = new JButton(new AbstractAction("Set") {
@Override
public void actionPerformed(ActionEvent e) {
SetDialog sbt = new SetDialog(SwingUtilities.getWindowAncestor(GeocodeItemPanel.this),model);
sbt.setLocationRelativeTo(GeocodeItemPanel.this);
sbt.showModal();
}
});
setButton.setToolTipText("Set the current latitude and longitude to one of several options");
addHalfWhitespace();
addLine(Box.createRigidArea(new Dimension()),
new JLabel("Latitude"),lat,Box.createRigidArea(new Dimension(6, 1)),
new JLabel("Longitude"), lng,Box.createRigidArea(new Dimension(6, 1)),clearButton,setButton,Box.createHorizontalGlue() );
// addHalfWhitespace();
writeToForm();
modelChanged(true, true);
model.addListener(this);
updateAppearance();
}
private void readFromForm() {
isReadingFromForm = true;
model.setAddress(address.getText());
Double dLat = null;
try {
dLat = Double.parseDouble(lat.getText());
} catch (Throwable e) {
}
Double dLng = null;
try {
dLng = Double.parseDouble(lng.getText());
} catch (Throwable e) {
}
model.setGeocode(dLat, dLng);
isReadingFromForm = false;
}
private void writeToForm() {
address.setText(model.getAddress() != null ? model.getAddress() : "", false);
class SetText{
void set(TextEntryPanel panel, Double value){
if(value!=null){
panel.setText(value.toString(), false);
}else{
panel.setText("", false);
}
}
}
SetText setText = new SetText();
setText.set(lat, model.getLatitude());
setText.set(lng, model.getLongitude());
}
@Override
public void modelChanged(boolean recordChanged, boolean searchResultsChanged) {
if(isReadingFromForm){
// the form itself has triggered the change event, so ignore
return;
}
writeToForm();
updateAppearance();
}
private void updateAppearance(){
int nb=0;
for(GeocodeAverageType gat : GeocodeAverageType.values()){
if(gat.isAvailable(model)){
nb++;
}
}
setButton.setEnabled(nb>0);
}
}