package tim.prune.function.edit;

import javax.swing.table.AbstractTableModel;

import tim.prune.I18nManager;

/**
 * Class to hold table model information for edit dialog
 */
public class EditFieldsTableModel extends AbstractTableModel
{
	private final String[] _fieldNames;
	private final String[] _originalValues;
	private final String[] _fieldValues;
	private final boolean[] _valueChanged;


	/**
	 * Constructor giving list size
	 * @param inSize number of fields
	 */
	public EditFieldsTableModel(int inSize)
	{
		_fieldNames     = new String[inSize];
		_originalValues = new String[inSize];
		_fieldValues    = new String[inSize];
		_valueChanged   = new boolean[inSize];
	}

	/**
	 * Set the given data in the array
	 * @param inName field name
	 * @param inValue field value
	 * @param inIndex index to place in array
	 */
	public void addFieldInfo(String inName, String inValue, int inIndex)
	{
		_fieldNames[inIndex] = inName;
		_originalValues[inIndex] = inValue;
		_fieldValues[inIndex] = inValue;
		_valueChanged[inIndex] = false;
	}

	public int getColumnCount() {
		return 2;
	}

	public int getRowCount() {
		return _fieldNames.length;
	}

	public Object getValueAt(int inRowIndex, int inColumnIndex)
	{
		if (inColumnIndex == 0) {
			return _fieldNames[inRowIndex];
		}
		return _fieldValues[inRowIndex];
	}

	/**
	 * @return true if cell is editable
	 */
	public boolean isCellEditable(int inRowIndex, int inColumnIndex) {
		return false;
	}

	/**
	 * Set the given cell value
	 */
	public void setValueAt(Object inValue, int inRowIndex, int inColumnIndex) {
		// ignore edits
	}

	/**
	 * @return Class of cell data
	 */
	public Class<?> getColumnClass(int inColumnIndex)
	{
		if (inColumnIndex <= 1) {
			return String.class;
		}
		return Boolean.class;
	}

	/**
	 * Get the name of the column
	 */
	public String getColumnName(int inColNum)
	{
		if (inColNum == 0) {
			return I18nManager.getText("dialog.pointedit.table.field");
		}
		return I18nManager.getText("dialog.pointedit.table.value");
	}

	/**
	 * Update the value of the given row
	 * @param inRowNum number of row, starting at 0
	 * @param inValue new value
	 */
	public void updateValue(int inRowNum, String inValue)
	{
		String origValue = _originalValues[inRowNum];
		String currValue = _fieldValues[inRowNum];
		// Update model if changed from original value
		_valueChanged[inRowNum] = areStringsDifferent(origValue, inValue);
		// Update model if changed from current value
		if (areStringsDifferent(currValue, inValue))
		{
			_fieldValues[inRowNum] = inValue;
			fireTableRowsUpdated(inRowNum, inRowNum);
		}
	}

	/**
	 * Compare two strings to see if they're equal or not (nulls treated the same as empty strings)
	 * @param inString1 first string
	 * @param inString2 second string
	 * @return true if the strings are different
	 */
	private static boolean areStringsDifferent(String inString1, String inString2)
	{
		// if both empty then same
		if ((inString1 == null || inString1.equals(""))
			&& (inString2 == null || inString2.equals("")))
		{
			return false;
		}
		return (inString1 == null || !inString1.equals(inString2));
	}

	/**
	 * Get the value at the given index
	 * @param inIndex index of field, starting at 0
	 * @return string value
	 */
	public String getValue(int inIndex) {
		return _fieldValues[inIndex];
	}

	/**
	 * Get the changed flag at the given index
	 * @param inIndex index of field, starting at 0
	 * @return true if field changed
	 */
	public boolean getChanged(int inIndex) {
		return _valueChanged[inIndex];
	}
}
