/* class DefaultTableModel * * Copyright (C) 2001 R M Pitman * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package charvax.swing.table; import java.util.Vector; /** * This is an implementation of the TableModel interface that uses a * Vector of Vectors to store the cell values. */ public class DefaultTableModel extends AbstractTableModel { /** Constructs a DefaultTableModel with the specified number of * rows and columns, and with cell values of null. */ public DefaultTableModel(int rows_, int columns_) { _rows = rows_; _columns = columns_; // Create empty vectors setDataVector(rows_, columns_); } /** Constructs a DefaultTableModel and initialises the table by passing * data_ and columnNames_ to the setDataVector method. */ public DefaultTableModel(Object[][] data_, Object[] columnNames_) { _rows = data_.length; _columns = columnNames_.length; setDataVector(data_, columnNames_); } /** Get the number of columns in the model. */ public int getColumnCount() { return _columns; } /** Get the name of the specified column. */ public String getColumnName(int column_) { if (_columnNames == null) { char heading = (char) (0x41 + column_); return String.valueOf(heading); } else { return _columnNames.elementAt(column_).toString(); } } /** Get the width of the specified column. */ public int getColumnWidth(int column_) { int width = ((Integer) _columnWidths.elementAt(column_)).intValue(); return width; } /** Get the number of rows in the model. */ public int getRowCount() { return _rows; } /** Returns an attribute value for the cell at (rowIndex, columnIndex) */ public Object getValueAt(int rowIndex_, int columnIndex_) { if (_dataVector == null) return null; Vector<Object> rowVector = (Vector<Object>) _dataVector.elementAt(rowIndex_); return rowVector.elementAt(columnIndex_); } /** Sets the attribute value for the cell at position (row, column). */ public void setValueAt(Object value_, int row_, int column_) { Vector<Object> rowVector = (Vector<Object>) _dataVector.elementAt(row_); rowVector.set(column_, value_); /* Recalculate the column width for the affected column. */ int columnwidth = 3; // default width if (_columnNames != null) { Object header = _columnNames.get(column_); columnwidth = header.toString().length() + 2; } for (int j=0; j<_rows; j++) { Object value = getValueAt(j, column_); if (value != null) { int width = value.toString().length(); if (width > columnwidth) columnwidth = width; } } _columnWidths.set(column_, new Integer(columnwidth)); fireTableCellUpdated(row_, column_); } /** Replaces the values in the _dataVector instance variable with the * values in the data_ array. The first index is the row index, the * second index is the column index. * The columnNames_ array supplies the new column names. */ public void setDataVector(Object[][] data_, Object[] columnNames_) { _rows = data_.length; _dataVector = new Vector<Vector<Object>>(_rows); for (int i=0; i<_rows; i++) { _columns = data_[i].length; Vector<Object> rowVector = new Vector<Object>(_columns); _dataVector.add(rowVector); for (int j=0; j<_columns; j++) rowVector.add(data_[i][j]); } /* Set up the column-name and column-width vectors */ _columnNames = new Vector<Object>(_columns); _columnWidths = new Vector<Integer>(_columns); for (int i=0; i<_columns; i++) { _columnNames.add(columnNames_[i]); int columnwidth = columnNames_[i].toString().length() + 2; for (int j=0; j<_rows; j++) { int width = getValueAt(j, i).toString().length(); if (width > columnwidth) columnwidth = width; } _columnWidths.add(new Integer(columnwidth)); } } /** Set up an empty data vector with the specified number of rows * and columns. */ public void setDataVector(int rows_, int columns_) { _dataVector = new Vector<Vector<Object>>(rows_); for (int i=0; i<rows_; i++) { Vector<Object> rowVector = new Vector<Object>(columns_); rowVector.setSize(columns_); _dataVector.add(rowVector); } _columnWidths = new Vector<Integer>(columns_); for (int i=0; i<columns_; i++) { int width; if (_columnNames == null) width = 3; else width = _columnNames.get(i).toString().length(); _columnWidths.add(new Integer(width)); } } //-------------------------------------------------------------------- // INSTANCE VARIABLES private int _rows; private int _columns; /** A vector of vectors of data values. Each vector in the _dataVector * represents a row of data. */ private Vector<Vector<Object>> _dataVector = null; /* A vector of column names */ private Vector<Object> _columnNames = null; /** A Vector of column widths */ private Vector<Integer> _columnWidths = null; }