package tim.prune.function.distance;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import tim.prune.App;
import tim.prune.GenericFunction;
import tim.prune.I18nManager;
import tim.prune.data.DataPoint;
import tim.prune.data.TrackInfo;
/**
* Class to provide the distance measuring function between waypoints
*/
public class DistanceFunction extends GenericFunction
{
/** Dialog */
private JDialog _dialog = null;
/** Table for 'from' point selection */
private JTable _pointTable = null;
/** Model for 'from' table */
private FromTableModel _fromModel = null;
/** Model for distance table */
private DistanceTableModel _distModel = null;
/**
* Constructor
* @param inApp App object
*/
public DistanceFunction(App inApp)
{
super(inApp);
}
/** Get the name key */
public String getNameKey() {
return "function.distances";
}
/**
* Begin the function
*/
public void begin()
{
if (_dialog == null)
{
_dialog = new JDialog(_parentFrame, I18nManager.getText(getNameKey()), true);
_dialog.setLocationRelativeTo(_parentFrame);
_dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
_dialog.getContentPane().add(makeDialogComponents());
_dialog.pack();
}
ArrayList<DataPoint> pointList = getPointList(_app.getTrackInfo());
// Check if point list has size at least 2
if (pointList.size() < 2) {
_app.showErrorMessage(getNameKey(), "dialog.distances.toofewpoints");
return;
}
_fromModel.init(pointList);
_distModel.init(pointList);
_pointTable.getSelectionModel().setSelectionInterval(0, 0);
_distModel.recalculate(0);
_dialog.setVisible(true);
}
/**
* Create dialog components
* @return Panel containing all gui elements in dialog
*/
private Component makeDialogComponents()
{
JPanel dialogPanel = new JPanel();
dialogPanel.setLayout(new BorderLayout(5, 5));
// Label at top
JLabel topLabel = new JLabel(I18nManager.getText("dialog.distances.intro"));
topLabel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
dialogPanel.add(topLabel, BorderLayout.NORTH);
JPanel mainPanel = new JPanel();
mainPanel.setLayout(new GridLayout(1, 2));
// First table for 'from point'
_fromModel = new FromTableModel();
_pointTable = new JTable(_fromModel);
_pointTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
/** selection changed */
public void valueChanged(ListSelectionEvent e) {
if (!e.getValueIsAdjusting()) {
_distModel.recalculate(_pointTable.getSelectedRow());
}
}
});
JScrollPane scrollPane = new JScrollPane(_pointTable);
scrollPane.setPreferredSize(new Dimension(100, 250));
mainPanel.add(scrollPane);
// second table for distances
_distModel = new DistanceTableModel();
JTable distTable = new JTable(_distModel);
// Use reflection to call distTable.setAutoCreateRowSorter(true) which is new with Java 1.6
try {
Class<?> d = Class.forName("javax.swing.JTable");
d.getDeclaredMethod("setAutoCreateRowSorter", new Class[]{Boolean.TYPE}).invoke(distTable, Boolean.TRUE);
}
catch (Exception e) {}
scrollPane = new JScrollPane(distTable);
scrollPane.setPreferredSize(new Dimension(200, 250));
mainPanel.add(scrollPane);
dialogPanel.add(mainPanel, BorderLayout.CENTER);
// close window if escape pressed
KeyAdapter escListener = new KeyAdapter() {
public void keyReleased(KeyEvent inE) {
if (inE.getKeyCode() == KeyEvent.VK_ESCAPE) {
_dialog.dispose();
}
}
};
_pointTable.addKeyListener(escListener);
distTable.addKeyListener(escListener);
// button panel at bottom
JPanel buttonPanel = new JPanel();
buttonPanel.setLayout(new FlowLayout(FlowLayout.RIGHT));
JButton closeButton = new JButton(I18nManager.getText("button.close"));
closeButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
_dialog.dispose();
}
});
buttonPanel.add(closeButton);
dialogPanel.add(buttonPanel, BorderLayout.SOUTH);
return dialogPanel;
}
/**
* Get the point list for the tables
* @param inTrackInfo TrackInfo object
*/
private static ArrayList<DataPoint> getPointList(TrackInfo inTrackInfo)
{
// Get the list of waypoints (if any)
ArrayList<DataPoint> pointList = new ArrayList<DataPoint>();
inTrackInfo.getTrack().getWaypoints(pointList);
// Get the current point (if any)
DataPoint currPoint = inTrackInfo.getCurrentPoint();
if (currPoint != null && !currPoint.isWaypoint()) {
// Add current point to start of list
pointList.add(0, currPoint);
}
return pointList;
}
}