]> gitweb.fperrin.net Git - GpsPrune.git/blobdiff - src/tim/prune/function/edit/PointNameEditor.java
Moved source into separate src directory due to popular request
[GpsPrune.git] / src / tim / prune / function / edit / PointNameEditor.java
diff --git a/src/tim/prune/function/edit/PointNameEditor.java b/src/tim/prune/function/edit/PointNameEditor.java
new file mode 100644 (file)
index 0000000..53e1f83
--- /dev/null
@@ -0,0 +1,234 @@
+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<inString.length(); i++)
+               {
+                       currChar = inString.charAt(i);
+                       buffer.append(lastChar == ' '?Character.toUpperCase(currChar):Character.toLowerCase(currChar));
+                       lastChar = currChar;
+               }
+               return buffer.toString();
+       }
+
+
+       /**
+        * Confirm the edit and inform the app
+        */
+       private void confirmEdit()
+       {
+               // Check whether name has really changed
+               if (hasNameChanged())
+               {
+                       // Make lists for edit and undo, and add the changed field
+                       FieldEditList editList = new FieldEditList();
+                       FieldEditList undoList = new FieldEditList();
+                       editList.addEdit(new FieldEdit(Field.WAYPT_NAME, _nameField.getText().trim()));
+                       undoList.addEdit(new FieldEdit(Field.WAYPT_NAME, _point.getWaypointName()));
+
+                       // Pass back to App to perform edit
+                       _app.completePointEdit(editList, undoList);
+               }
+       }
+
+       /**
+        * Check whether the name has been changed or not
+        * @return true if the new name is different
+        */
+       private boolean hasNameChanged()
+       {
+               String prevName = _point.getWaypointName();
+               String newName = _nameField.getText().trim();
+               boolean prevNull = (prevName == null || prevName.equals(""));
+               boolean newNull = (newName == null || newName.equals(""));
+               return (prevNull && !newNull)
+                       || (!prevNull && newNull)
+                       || (!prevNull && !newNull && !prevName.equals(newName));
+       }
+}