package tim.prune.function; import java.awt.BorderLayout; import java.awt.Component; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import javax.swing.BorderFactory; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextField; 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.gui.WaypointNameMatcher; /** * Class to provide the function to find a waypoint by name */ public class FindWaypoint extends GenericFunction { private WaypointNameMatcher _nameMatcher = null; private JDialog _dialog = null; private JTextField _searchField = null; private JList _pointList = null; private JButton _okButton = null; /** * Constructor * @param inApp application object for callback */ public FindWaypoint(App inApp) { super(inApp); } /** Get the name key */ public String getNameKey() { return "function.findwaypoint"; } /** * Begin the function */ public void begin() { // Make dialog window 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(); } // Initialise waypoint list from track _nameMatcher.init(_app.getTrackInfo().getTrack()); // Show dialog _searchField.setText(""); _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()); JPanel topPanel = new JPanel(); topPanel.setLayout(new BoxLayout(topPanel, BoxLayout.Y_AXIS)); topPanel.add(new JLabel(I18nManager.getText("dialog.findwaypoint.intro"))); JPanel subPanel = new JPanel(); subPanel.add(new JLabel(I18nManager.getText("dialog.findwaypoint.search"))); _searchField = new JTextField(12); _searchField.addKeyListener(new KeyAdapter() { public void keyReleased(KeyEvent e) { _nameMatcher.findMatches(_searchField.getText()); if (_nameMatcher.getSize() == 0 || _nameMatcher.getSize() < _pointList.getSelectedIndex()) _okButton.setEnabled(false); else if (_pointList.getSelectedIndex() >= 0) _okButton.setEnabled(true); // close dialog if escape pressed if (e.getKeyCode() == KeyEvent.VK_ESCAPE) { _dialog.dispose(); } } }); subPanel.add(_searchField); topPanel.add(subPanel); dialogPanel.add(topPanel, BorderLayout.NORTH); // middle panel with list _nameMatcher = new WaypointNameMatcher(); _pointList = new JList(_nameMatcher); _pointList.addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { if (!e.getValueIsAdjusting()) _okButton.setEnabled(true); }}); JScrollPane listPane = new JScrollPane(_pointList); dialogPanel.add(listPane, BorderLayout.CENTER); // button panel at bottom JPanel buttonPanel = new JPanel(); buttonPanel.setLayout(new FlowLayout(FlowLayout.RIGHT)); _okButton = new JButton(I18nManager.getText("button.ok")); ActionListener okListener = new ActionListener() { public void actionPerformed(ActionEvent e) { finish(); } }; _okButton.addActionListener(okListener); _okButton.setEnabled(false); buttonPanel.add(_okButton); JButton cancelButton = new JButton(I18nManager.getText("button.cancel")); cancelButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { _dialog.dispose(); } }); buttonPanel.add(cancelButton); dialogPanel.add(buttonPanel, BorderLayout.SOUTH); dialogPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 15)); return dialogPanel; } /** * Finish the dialog when OK pressed * Select the point and close the dialog */ private void finish() { DataPoint selectedPoint = _nameMatcher.getWaypoint(_pointList.getSelectedIndex()); _app.getTrackInfo().selectPoint(selectedPoint); _dialog.dispose(); } }