X-Git-Url: https://gitweb.fperrin.net/?p=GpsPrune.git;a=blobdiff_plain;f=src%2Ftim%2Fprune%2Ffunction%2FFindWaypoint.java;fp=src%2Ftim%2Fprune%2Ffunction%2FFindWaypoint.java;h=ac0bd37290005c4d281f49b1525c218599072d75;hp=0000000000000000000000000000000000000000;hb=ce6f2161b8596f7018d6a76bff79bc9e571f35fd;hpb=2d8cb72e84d5cc1089ce77baf1e34ea3ea2f8465 diff --git a/src/tim/prune/function/FindWaypoint.java b/src/tim/prune/function/FindWaypoint.java new file mode 100644 index 0000000..ac0bd37 --- /dev/null +++ b/src/tim/prune/function/FindWaypoint.java @@ -0,0 +1,156 @@ +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(); + } +}