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