/*
* Table.java
*
* Created on February 15, 2006, 9:33 PM
*
*/
package edu.oregonstate.cartography.geometryimport;
import java.io.*;
import java.util.*;
import javax.swing.event.TableModelListener;
import javax.swing.table.*;
/**
*
* @author jenny
*/
public class Table extends DefaultTableModel
implements java.io.Serializable {
private String name;
private final TableColumnModel tableColumnModel;
private ArrayList geometries;
/**
* Store the name of the character set used by the source. Strings are
* stored in this table as standard UTF Java strings. The name of the
* source character set is used when the encoding must be changed at a later date.
*/
private String sourceCharsetName;
public Table(String sourceCharsetName) {
this.name = "unnamed";
this.tableColumnModel = new DefaultTableColumnModel();
this.geometries = new ArrayList(1);
this.sourceCharsetName = sourceCharsetName;
}
/**
* Serializable.
*/
private void writeObject(ObjectOutputStream outputStream) throws IOException {
// don't serialize the attached TableModelModelListeners. Serializing
// them is not possible. Temporarily remove them, serialize, and add
// them again.
TableModelListener[] tml = this.getTableModelListeners();
for(int i=0;i<tml.length;++i)
this.removeTableModelListener(tml[i]);
outputStream.defaultWriteObject();
for(int i=0;i<tml.length;++i)
this.addTableModelListener(tml[i]);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public TableColumn getColumn(int id) {
return this.tableColumnModel.getColumn(id);
}
public int getNbrColumns() {
return this.tableColumnModel.getColumnCount();
}
public double[] getMinMax (int colID) {
return this.getMinMax(colID, false, false);
}
public double[] getMinMax (int colID, boolean absolute, boolean notZero) {
try {
double min = Double.MAX_VALUE;
double max = -Double.MAX_VALUE;
final int nRows = this.getRowCount();
for (int i = 0; i < nRows; i++) {
double d = ((Double)this.getValueAt(i, colID)).doubleValue();
if (absolute)
d = Math.abs(d);
if (d == 0. && notZero)
continue;
if (d < min)
min = d;
if (d > max)
max = d;
}
return new double[] {min, max};
} catch (Exception exc) {
return null;
}
}
@Override
public String toString() {
return this.getName();
}
public void addColumn(String name) {
super.addColumn(name);
TableColumn tableColumn = new DisplayableTableColumn(this.getNbrColumns());
tableColumn.setHeaderValue(name);
this.tableColumnModel.addColumn(tableColumn);
}
public ArrayList getGeometries() {
return geometries;
}
public void setGeometries(ArrayList geometries) {
this.geometries = geometries;
}
public int findRowWithValue (Object value, int columnID) {
final int nbrRows = this.getRowCount();
for (int i = 0; i < nbrRows; i++) {
Object tableValue = this.getValueAt(i, columnID);
if (value.equals(tableValue))
return i;
}
return -1;
}
/**
* Returns the Class object of the first cell in specified column in the
* table model. Unless this method is overridden, all values are assumed
* to be of the returned Class.
* @param columnIndex The id of the column.
* @return A Class object. All values in this column are of this Class.
*/
public Class getColumnClass(int columnIndex) {
Object o = getValueAt(0, columnIndex);
if (o == null) {
return Object.class;
} else {
return o.getClass();
}
}
public boolean isStringColumn (int columnIndex) {
Class cl = this.getColumnClass(columnIndex);
return (String.class.isAssignableFrom(cl));
}
public boolean isDoubleColumn (int columnIndex) {
Class cl = this.getColumnClass(columnIndex);
return (Double.class.isAssignableFrom(cl));
}
/**
* Returns the name of the characters set that was used to encode the source
* data of this table.
* @return A name, e.g. MacRoman or UTF-16.
*/
public String getEncodingName() {
return this.sourceCharsetName;
}
/**
* Change the character encoding of all Strings stored in this table.
* This could be optimized for speed!
* @param charsetName The name of the new encoding. This name will be stored
* in this object. E.g. MacRoman or UTF-16.
* @throws java.io.UnsupportedEncodingException
*/
public void changeEncoding(String charsetName)
throws UnsupportedEncodingException{
// if the source encoding is not known, assume the default encoding
// of this VM was used.
if (this.sourceCharsetName == null)
this.sourceCharsetName = System.getProperty("file.encoding");
final int nCols = this.getNbrColumns();
final int nRows = this.getRowCount();
for (int c = 0; c < nCols; c++) {
Class cl = this.getColumnClass(c);
// search for columns of Strings
if (String.class.isAssignableFrom(cl) == false) {
continue;
}
// change each string back to the original encoding, and then
// forward to the new encoding
for (int r = 0; r < nRows; r++) {
String str = (String) this.getValueAt(r, c);
byte[] bytes = str.getBytes(this.sourceCharsetName);
String newStr = new String(bytes, charsetName);
this.setValueAt(newStr, r, c);
}
}
// store the name of the character set encoding
this.sourceCharsetName = charsetName;
}
}