]> gitweb.fperrin.net Git - GpsPrune.git/blobdiff - src/tim/prune/load/FieldSelectionTableModel.java
Moved source into separate src directory due to popular request
[GpsPrune.git] / src / tim / prune / load / FieldSelectionTableModel.java
diff --git a/src/tim/prune/load/FieldSelectionTableModel.java b/src/tim/prune/load/FieldSelectionTableModel.java
new file mode 100644 (file)
index 0000000..d4d92a0
--- /dev/null
@@ -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;
+       }
+}