X-Git-Url: http://gitweb.fperrin.net/?p=GpsPrune.git;a=blobdiff_plain;f=src%2Ftim%2Fprune%2Fload%2FFieldSelectionTableModel.java;fp=src%2Ftim%2Fprune%2Fload%2FFieldSelectionTableModel.java;h=d4d92a0429f239797eb8770bbf419e87e195234e;hp=0000000000000000000000000000000000000000;hb=ce6f2161b8596f7018d6a76bff79bc9e571f35fd;hpb=2d8cb72e84d5cc1089ce77baf1e34ea3ea2f8465 diff --git a/src/tim/prune/load/FieldSelectionTableModel.java b/src/tim/prune/load/FieldSelectionTableModel.java new file mode 100644 index 0000000..d4d92a0 --- /dev/null +++ b/src/tim/prune/load/FieldSelectionTableModel.java @@ -0,0 +1,247 @@ +package tim.prune.load; + +import javax.swing.table.AbstractTableModel; + +import tim.prune.I18nManager; +import tim.prune.data.Field; + +/** + * Class to hold the table model for the field selection table + */ +public class FieldSelectionTableModel extends AbstractTableModel +{ + + private int _numRows = 0; + private Field[] _fieldArray = null; + private String _customText = null; + + /** + * Constructor + */ + public FieldSelectionTableModel() + { + // Cache the custom text for the table so it doesn't + // have to be looked up so often + _customText = I18nManager.getText("fieldname.custom"); + } + + + /** + * @return the column count + */ + public int getColumnCount() + { + return 3; + } + + + /** + * @param inColNum column number + * @return name of the column + */ + public String getColumnName(int inColNum) + { + if (inColNum == 0) return I18nManager.getText("dialog.load.table.field"); + else if (inColNum == 1) return I18nManager.getText("dialog.load.table.datatype"); + return I18nManager.getText("dialog.load.table.description"); + } + + + /** + * @return the row count + */ + public int getRowCount() + { + if (_fieldArray == null) + return 2; + return _numRows; + } + + + /** + * @param inRowIndex row index + * @param inColumnIndex column index + * @return the value of the specified cell + */ + public Object getValueAt(int inRowIndex, int inColumnIndex) + { + if (_fieldArray == null) return ""; + if (inColumnIndex == 0) return ("" + (inRowIndex+1)); + Field field = _fieldArray[inRowIndex]; + if (inColumnIndex == 1) + { + // Field name - take name from built-in fields + if (field.isBuiltIn()) + return field.getName(); + // Otherwise take custom name + return _customText; + } + // description column - builtin fields don't have one + if (field.isBuiltIn()) return ""; + return field.getName(); + } + + + /** + * Make sure only second and third columns are editable + * @param inRowIndex row index + * @param inColumnIndex column index + * @return true if cell editable + */ + public boolean isCellEditable(int inRowIndex, int inColumnIndex) + { + if (inColumnIndex <= 1) + return (inColumnIndex == 1); + // Column is 2 so only edit non-builtin field names + Field field = _fieldArray[inRowIndex]; + return !field.isBuiltIn(); + } + + + /** + * Update the data + * @param inData 2-dimensional Object array containing the data + */ + public void updateData(Field[] inData) + { + _fieldArray = inData; + if (_fieldArray != null) + { + _numRows = _fieldArray.length; + } + fireTableStructureChanged(); + } + + + /** + * React to edits to the table data + * @param inValue value to set + * @param inRowIndex row index + * @param inColumnIndex column index + */ + public void setValueAt(Object inValue, int inRowIndex, int inColumnIndex) + { + super.setValueAt(inValue, inRowIndex, inColumnIndex); + if (inColumnIndex == 1) + { + Field field = _fieldArray[inRowIndex]; + if (!field.getName().equals(inValue.toString())) + { + manageFieldChange(inRowIndex, inValue.toString()); + } + } + else if (inColumnIndex == 2) + { + // change description if it's custom + Field field = _fieldArray[inRowIndex]; + if (!field.isBuiltIn()) + field.setName(inValue.toString()); + } + } + + + /** + * Move the selected item up one place + * @param inIndex index of item to move + */ + public void moveUp(int inIndex) + { + if (inIndex > 0) + { + swapItems(inIndex-1, inIndex); + } + } + + + /** + * Move the selected item down one place + * @param inIndex index of item to move + */ + public void moveDown(int inIndex) + { + if (inIndex > -1 && inIndex < (_numRows - 1)) + { + swapItems(inIndex, inIndex+1); + } + } + + + /** + * Swap the specified items in the array + * @param inIndex1 index of first item + * @param inIndex2 index of second item (higher than inIndex1) + */ + private void swapItems(int inIndex1, int inIndex2) + { + Field temp = _fieldArray[inIndex1]; + _fieldArray[inIndex1] = _fieldArray[inIndex2]; + _fieldArray[inIndex2] = temp; + fireTableRowsUpdated(inIndex1, inIndex2); + } + + + /** + * React to a requested change to one of the fields + * @param inRow row number of change + * @param inValue new string value + */ + private void manageFieldChange(int inRow, String inValue) + { + // check if it's lat or long - don't allow changes to these fields + Field field = _fieldArray[inRow]; + if (field == Field.LATITUDE || field == Field.LONGITUDE) + return; + if (inValue.equals(I18nManager.getText("fieldname.latitude")) + || inValue.equals(I18nManager.getText("fieldname.longitude"))) + return; + + // Changes to custom field need to be handled differently + boolean changeToCustom = inValue.equals(I18nManager.getText("fieldname.custom")); + if (changeToCustom) + { + if (field.isBuiltIn()) + { + String customPrefix = I18nManager.getText("fieldname.prefix") + " "; + int index = inRow + 1; + while (hasField(customPrefix + index)) + index++; + _fieldArray[inRow] = new Field(customPrefix + index); + } + // ignore custom to custom changes + } + else + { + // Change to a fixed field - check we've not already got it + if (!hasField(inValue)) + { + // Change is ok - find new Field object corresponding to text + _fieldArray[inRow] = Field.getField(inValue); + } + } + // fire change + fireTableRowsUpdated(inRow, inRow); + } + + + /** + * @return array of Field objects + */ + public Field[] getFieldArray() + { + return _fieldArray; + } + + + /** + * @param inName Name of field to find + * @return true if this field is already present + */ + private boolean hasField(String inName) + { + if (_fieldArray == null || inName == null) return false; + for (int i=0; i<_numRows; i++) + if (_fieldArray[i].getName().equals(inName)) + return true; + return false; + } +}