X-Git-Url: https://gitweb.fperrin.net/?p=GpsPrune.git;a=blobdiff_plain;f=src%2Ftim%2Fprune%2Ffunction%2Fedit%2FPointEditor.java;fp=src%2Ftim%2Fprune%2Ffunction%2Fedit%2FPointEditor.java;h=c66201b8d6f48ebcdf56105daa126077d0b85486;hp=0000000000000000000000000000000000000000;hb=ce6f2161b8596f7018d6a76bff79bc9e571f35fd;hpb=2d8cb72e84d5cc1089ce77baf1e34ea3ea2f8465 diff --git a/src/tim/prune/function/edit/PointEditor.java b/src/tim/prune/function/edit/PointEditor.java new file mode 100644 index 0000000..c66201b --- /dev/null +++ b/src/tim/prune/function/edit/PointEditor.java @@ -0,0 +1,316 @@ +package tim.prune.function.edit; + +import java.awt.BorderLayout; +import java.awt.Color; +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 javax.swing.BorderFactory; +import javax.swing.BoxLayout; +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTable; +import javax.swing.JTextArea; +import javax.swing.JTextField; +import javax.swing.ListSelectionModel; +import javax.swing.SwingUtilities; +import javax.swing.event.ListSelectionEvent; +import javax.swing.event.ListSelectionListener; +import javax.swing.table.TableCellRenderer; + +import tim.prune.App; +import tim.prune.I18nManager; +import tim.prune.config.Config; +import tim.prune.data.DataPoint; +import tim.prune.data.Field; +import tim.prune.data.FieldList; +import tim.prune.data.Track; +import tim.prune.data.Unit; + +/** + * Class to manage the display and editing of point data + */ +public class PointEditor +{ + private App _app = null; + private JFrame _parentFrame = null; + private JDialog _dialog = null; + private JTable _table = null; + private JLabel _fieldnameLabel = null; + private JTextField _valueField = null; + private JTextArea _valueArea = null; + private JScrollPane _valueAreaPane = null; + private Track _track = null; + private DataPoint _point = null; + private EditFieldsTableModel _model = null; + private JButton _cancelButton = null; + private int _prevRowIndex = -1; + + + /** + * Constructor + * @param inApp application object to inform of success + * @param inParentFrame parent frame + */ + public PointEditor(App inApp, JFrame inParentFrame) + { + _app = inApp; + _parentFrame = inParentFrame; + } + + + /** + * Show the edit point dialog + * @param inTrack track object + * @param inPoint point to edit + */ + public void showDialog(Track inTrack, DataPoint inPoint) + { + _track = inTrack; + _point = inPoint; + _dialog = new JDialog(_parentFrame, I18nManager.getText("dialog.pointedit.title"), true); + _dialog.setLocationRelativeTo(_parentFrame); + // Check field list + FieldList fieldList = _track.getFieldList(); + int numFields = fieldList.getNumFields(); + // Create table model for point editor + _model = new EditFieldsTableModel(numFields); + for (int i=0; i= 0) + { + Field prevField = _track.getFieldList().getField(_prevRowIndex); + boolean littleField = prevField.isBuiltIn() && prevField != Field.DESCRIPTION; + String newValue = littleField ? _valueField.getText() : _valueArea.getText(); + // Update the model from the current GUI values + _model.updateValue(_prevRowIndex, newValue); + } + + if (rowNum < 0) + { + _fieldnameLabel.setText(""); + } + else + { + String currValue = _model.getValue(rowNum); + Field field = _track.getFieldList().getField(rowNum); + _fieldnameLabel.setText(makeFieldLabel(field, _point)); + _fieldnameLabel.setVisible(true); + boolean littleField = field.isBuiltIn() && field != Field.DESCRIPTION; + if (littleField) { + _valueField.setText(currValue); + } + else { + _valueArea.setText(currValue); + } + _valueField.setVisible(littleField); + _valueAreaPane.setVisible(!littleField); + if (littleField) { + _valueField.requestFocus(); + } + else { + _valueArea.requestFocus(); + } + } + _prevRowIndex = rowNum; + } + + /** + * @param inField field + * @param inPoint current point + * @return label string for above the entry field / area + */ + private static String makeFieldLabel(Field inField, DataPoint inPoint) + { + String label = I18nManager.getText("dialog.pointedit.table.field") + ": " + inField.getName(); + // Add units if the field is altitude / speed / vspeed + if (inField == Field.ALTITUDE) + { + label += makeUnitsLabel(inPoint.hasAltitude() ? inPoint.getAltitude().getUnit() : Config.getUnitSet().getAltitudeUnit()); + } + else if (inField == Field.SPEED) + { + label += makeUnitsLabel(inPoint.hasHSpeed() ? inPoint.getHSpeed().getUnit() : Config.getUnitSet().getSpeedUnit()); + } + else if (inField == Field.VERTICAL_SPEED) + { + label += makeUnitsLabel(inPoint.hasVSpeed() ? inPoint.getVSpeed().getUnit() : Config.getUnitSet().getVerticalSpeedUnit()); + } + return label; + } + + /** + * @param inUnit units for altitude / speed + * @return addition to the field label to describe the units + */ + private static String makeUnitsLabel(Unit inUnit) + { + if (inUnit == null) return ""; + return " (" + I18nManager.getText(inUnit.getShortnameKey()) + ")"; + } + + /** + * Confirm the edit and inform the app + */ + private void confirmEdit() + { + // Apply the edits to the current field + int rowNum = _table.getSelectedRow(); + if (rowNum >= 0) + { + Field currField = _track.getFieldList().getField(rowNum); + boolean littleField = currField.isBuiltIn() && currField != Field.DESCRIPTION; + String newValue = littleField ? _valueField.getText() : _valueArea.getText(); + _model.updateValue(_prevRowIndex, newValue); + } + + // Package the modified fields into an object + FieldList fieldList = _track.getFieldList(); + int numFields = fieldList.getNumFields(); + // Make lists for edit and undo, and add each changed field in turn + FieldEditList editList = new FieldEditList(); + FieldEditList undoList = new FieldEditList(); + for (int i=0; i