/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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.TableColumn; 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> */ 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, property, 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, property, 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) { return addColumn(headerValue, headerValue, columnValueModel); } public DefaultTableColumn addColumn(Object headerValue, Object identifier, ValueModel columnValueModel) { DefaultTableColumn answer = new DefaultTableColumn(headerValue, identifier, 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 void removeColumn(TableColumn column) { super.removeColumn(column); renumberTableColumns(); } public void moveColumn(int columnIndex, int newIndex) { super.moveColumn(columnIndex, newIndex); renumberTableColumns(); } public void renumberTableColumns() { for (int i = tableColumns.size() - 1; i >= 0; i--) { ((DefaultTableColumn)tableColumns.get(i)).setModelIndex(i); } } } public ValueModel getRowModel() { return rowModel; } public ValueModel getRowsModel() { return rowsModel; } }