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;
}
}