blob: 7e0c9132a8983e8e0ab8fdd5a0dc9c041d9b6bbd [file] [log] [blame]
/*
* Copyright 2003-2007 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package groovy.model;
import groovy.lang.Closure;
import org.codehaus.groovy.runtime.InvokerHelper;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableColumnModel;
import javax.swing.table.TableColumnModel;
import java.util.Collections;
import java.util.List;
/**
* A default table model made up of PropertyModels on a Value model.
*
* @author <a href="mailto:james@coredevelopers.net">James Strachan</a>
* @version $Revision$
*/
public class DefaultTableModel extends AbstractTableModel {
private ValueModel rowModel;
private ValueModel rowsModel;
private MyTableColumnModel columnModel = new MyTableColumnModel();
public DefaultTableModel(ValueModel rowsModel) {
this(rowsModel, new ValueHolder());
}
public DefaultTableModel(ValueModel rowsModel, ValueModel rowModel) {
this.rowModel = rowModel;
this.rowsModel = rowsModel;
}
/**
* @return the column definitions.
*/
public List getColumnList() {
return columnModel.getColumnList();
}
public TableColumnModel getColumnModel() {
return columnModel;
}
/**
* Adds a property model column to the table
*/
public DefaultTableColumn addPropertyColumn(Object headerValue, String property, Class type) {
return addColumn(headerValue, new PropertyModel(rowModel, property, type));
}
/**
* Adds a property model column to the table
*/
public DefaultTableColumn addPropertyColumn(Object headerValue, String property, Class type, boolean editable) {
return addColumn(headerValue, new PropertyModel(rowModel, property, type, editable));
}
/**
* Adds a closure based column to the table
*/
public DefaultTableColumn addClosureColumn(Object headerValue, Closure readClosure, Closure writeClosure, Class type) {
return addColumn(headerValue, new ClosureModel(rowModel, readClosure, writeClosure, type));
}
public DefaultTableColumn addColumn(Object headerValue, ValueModel columnValueModel) {
DefaultTableColumn answer = new DefaultTableColumn(headerValue, columnValueModel);
addColumn(answer);
return answer;
}
/**
* Adds a new column definition to the table
*/
public void addColumn(DefaultTableColumn column) {
column.setModelIndex(columnModel.getColumnCount());
columnModel.addColumn(column);
}
/**
* Removes a column definition from the table
*/
public void removeColumn(DefaultTableColumn column) {
columnModel.removeColumn(column);
}
public int getRowCount() {
return getRows().size();
}
public int getColumnCount() {
return columnModel.getColumnCount();
}
public String getColumnName(int columnIndex) {
String answer = null;
if (columnIndex < 0 || columnIndex >= columnModel.getColumnCount()) {
return answer;
}
Object value = columnModel.getColumn(columnIndex).getHeaderValue();
if (value != null) {
return value.toString();
}
return answer;
}
public Class getColumnClass(int columnIndex) {
return getColumnModel(columnIndex).getType();
}
public boolean isCellEditable(int rowIndex, int columnIndex) {
return getColumnModel(columnIndex).isEditable();
}
public Object getValueAt(int rowIndex, int columnIndex) {
List rows = getRows();
Object answer = null;
if (rowIndex < 0 || rowIndex >= rows.size()) {
return answer;
}
if (columnIndex < 0 || columnIndex >= columnModel.getColumnCount()) {
return answer;
}
Object row = getRows().get(rowIndex);
rowModel.setValue(row);
DefaultTableColumn column = (DefaultTableColumn) columnModel.getColumn(columnIndex);
if (row == null || column == null) {
return answer;
}
return column.getValue(row, rowIndex, columnIndex);
}
public void setValueAt(Object value, int rowIndex, int columnIndex) {
List rows = getRows();
if (rowIndex < 0 || rowIndex >= rows.size()) {
return;
}
if (columnIndex < 0 || columnIndex >= columnModel.getColumnCount()) {
return;
}
Object row = getRows().get(rowIndex);
rowModel.setValue(row);
DefaultTableColumn column = (DefaultTableColumn) columnModel.getColumn(columnIndex);
if (row == null || column == null) {
return;
}
column.setValue(row, value, rowIndex, columnIndex);
}
protected ValueModel getColumnModel(int columnIndex) {
DefaultTableColumn column = (DefaultTableColumn) columnModel.getColumn(columnIndex);
return column.getValueModel();
}
protected List getRows() {
Object value = rowsModel.getValue();
if (value == null) {
return Collections.EMPTY_LIST;
}
return InvokerHelper.asList(value);
}
protected static class MyTableColumnModel extends DefaultTableColumnModel {
public List getColumnList() {
return tableColumns;
}
}
public ValueModel getRowModel() {
return rowModel;
}
public ValueModel getRowsModel() {
return rowsModel;
}
}