package tim.prune.function.edit; import java.awt.Component; import java.awt.BorderLayout; 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.JPanel; import javax.swing.JTextField; import tim.prune.App; import tim.prune.GenericFunction; import tim.prune.I18nManager; import tim.prune.data.DataPoint; import tim.prune.data.Field; /** * Function to manage the display and editing of waypoint names */ public class PointNameEditor extends GenericFunction { private JDialog _dialog = null; private DataPoint _point = null; private JTextField _nameField = null; private JButton _okButton = null; /** * Constructor * @param inApp application object to inform of success */ public PointNameEditor(App inApp) { super(inApp); } /** Get the name key */ public String getNameKey() { return "function.editwaypointname"; } /** * Begin the function by showing the edit point name dialog */ public void begin() { _point = _app.getTrackInfo().getCurrentPoint(); if (_dialog == null) { _dialog = new JDialog(_parentFrame, I18nManager.getText(getNameKey()), true); _dialog.setLocationRelativeTo(_parentFrame); // Create Gui and show it _dialog.getContentPane().add(makeDialogComponents()); _dialog.pack(); } // Check current waypoint name, if any String name = _point.getWaypointName(); resetDialog(name); _dialog.setVisible(true); } /** * Make the dialog components * @return the GUI components for the dialog */ private Component makeDialogComponents() { JPanel panel = new JPanel(); panel.setLayout(new BorderLayout()); // Create GUI layout for point name editor JPanel centrePanel = new JPanel(); centrePanel.setLayout(new BorderLayout(8, 8)); centrePanel.add(new JLabel(I18nManager.getText("dialog.pointnameedit.name") + ": "), BorderLayout.WEST); // Make listener to react to ok being pressed ActionListener okActionListener = new ActionListener() { public void actionPerformed(ActionEvent e) { // update App with edit confirmEdit(); _dialog.dispose(); } }; _nameField = new JTextField("", 12); _nameField.addKeyListener(new KeyAdapter() { public void keyReleased(KeyEvent e) { // close dialog if escape pressed if (e.getKeyCode() == KeyEvent.VK_ESCAPE) { _dialog.dispose(); } // Enable ok button if name changed _okButton.setEnabled(hasNameChanged()); } }); _nameField.addActionListener(okActionListener); centrePanel.add(_nameField, BorderLayout.CENTER); // holder panel to stop the text box from being stretched JPanel holderPanel = new JPanel(); holderPanel.setLayout(new BorderLayout()); holderPanel.setBorder(BorderFactory.createEmptyBorder(8, 8, 8, 8)); holderPanel.add(centrePanel, BorderLayout.NORTH); panel.add(holderPanel, BorderLayout.CENTER); JPanel rightPanel = new JPanel(); rightPanel.setLayout(new BoxLayout(rightPanel, BoxLayout.Y_AXIS)); JButton upperButton = new JButton(I18nManager.getText("dialog.pointnameedit.uppercase")); upperButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { _nameField.setText(_nameField.getText().toUpperCase()); _okButton.setEnabled(true); _nameField.requestFocus(); } }); rightPanel.add(upperButton); JButton lowerButton = new JButton(I18nManager.getText("dialog.pointnameedit.lowercase")); lowerButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { _nameField.setText(_nameField.getText().toLowerCase()); _okButton.setEnabled(true); _nameField.requestFocus(); } }); rightPanel.add(lowerButton); JButton titleButton = new JButton(I18nManager.getText("dialog.pointnameedit.titlecase")); titleButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { _nameField.setText(titleCase(_nameField.getText())); _okButton.setEnabled(true); _nameField.requestFocus(); } }); rightPanel.add(titleButton); panel.add(rightPanel, BorderLayout.EAST); // Bottom panel for OK, cancel buttons JPanel lowerPanel = new JPanel(); lowerPanel.setLayout(new FlowLayout(FlowLayout.RIGHT)); JButton cancelButton = new JButton(I18nManager.getText("button.cancel")); cancelButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { _dialog.dispose(); } }); lowerPanel.add(cancelButton); _okButton = new JButton(I18nManager.getText("button.ok")); _okButton.setEnabled(false); _okButton.addActionListener(okActionListener); lowerPanel.add(_okButton); panel.add(lowerPanel, BorderLayout.SOUTH); return panel; } /** * Reset the dialog with the given name * @param inName waypoint name */ private void resetDialog(String inName) { _nameField.setText(inName); _okButton.setEnabled(false); } /** * Turn a String into title case by capitalizing each word * @param inString String to convert * @return capitalized String */ private static String titleCase(String inString) { // Check first for empty strings if (inString == null || inString.equals("")) { return ""; } StringBuffer buffer = new StringBuffer(); // loop through characters char lastChar = ' ', currChar = ' '; for (int i=0; i