1 /* 2 * Copyright (c) 2006 Stiftung Deutsches Elektronen-Synchroton, 3 * Member of the Helmholtz Association, (DESY), HAMBURG, GERMANY. 4 * 5 * THIS SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN "../AS IS" BASIS. 6 * WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED 7 * TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR PARTICULAR PURPOSE AND 8 * NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE 9 * FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 10 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR 11 * THE USE OR OTHER DEALINGS IN THE SOFTWARE. SHOULD THE SOFTWARE PROVE DEFECTIVE 12 * IN ANY RESPECT, THE USER ASSUMES THE COST OF ANY NECESSARY SERVICING, REPAIR OR 13 * CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. 14 * NO USE OF ANY SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. 15 * DESY HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, 16 * OR MODIFICATIONS. 17 * THE FULL LICENSE SPECIFYING FOR THE SOFTWARE THE REDISTRIBUTION, MODIFICATION, 18 * USAGE AND OTHER RIGHTS AND OBLIGATIONS IS INCLUDED WITH THE DISTRIBUTION OF THIS 19 * PROJECT IN THE FILE LICENSE.HTML. IF THE LICENSE IS NOT INCLUDED YOU MAY FIND A COPY 20 * AT HTTP://WWW.DESY.DE/LEGAL/LICENSE.HTM 21 */ 22 23 package de.desy.acop.displayers.table; 24 25 import java.util.Vector; 26 27 import javax.swing.event.TableModelEvent; 28 import javax.swing.table.AbstractTableModel; 29 import javax.swing.table.TableModel; 30 31 import de.desy.acop.displayers.AcopTable; 32 33 /** 34 * <code>AcopTableModel</code> is an implementation of the <code>TableModel</code> 35 * used in combinataion with <code>AcopTable</code>. AcopTableModel is a read only 36 * model which can hold any number of <code>AcopTableColumn</code>s. The model 37 * listenes to each of this columns and updates the table according to the changes 38 * in the columns. The number of columns in the model can be changed in run time. 39 * 40 * @author Jaka Bobnar, Cosylab 41 * @see AcopTable 42 * @see AcopTableColumn 43 * 44 */ 45 public class AcopTableModel extends AbstractTableModel implements TableModel, TableColumnListener { 46 47 private static final long serialVersionUID = 3387896763789247131L; 48 49 private Vector<AcopTableColumn> columns = new Vector<AcopTableColumn>(); 50 51 private int rowCount = 10; 52 53 /** 54 * Constructs new AcopTableModel 55 * 56 */ 57 public AcopTableModel() { 58 super(); 59 } 60 61 /* 62 * (non-Javadoc) 63 * @see javax.swing.table.TableModel#getColumnClass(int) 64 */ 65 public Class<?> getColumnClass(int columnIndex) { 66 return columns.get(columnIndex).getColumnClass(); 67 } 68 69 /* 70 * (non-Javadoc) 71 * @see javax.swing.table.TableModel#getColumnCount() 72 */ 73 public int getColumnCount() { 74 return columns.size(); 75 } 76 77 /* 78 * (non-Javadoc) 79 * @see javax.swing.table.TableModel#getColumnName(int) 80 */ 81 public String getColumnName(int columnIndex) { 82 return columns.get(columnIndex).getHeaderName(); 83 } 84 85 /* 86 * (non-Javadoc) 87 * @see javax.swing.table.TableModel#getRowCount() 88 */ 89 public int getRowCount() { 90 return rowCount; 91 } 92 93 /** 94 * Sets the number of rows presented in the table. 95 * 96 * @param rowCount 97 */ 98 public void setRowCount(int rowCount) { 99 this.rowCount = rowCount; 100 for (AcopTableColumn c : columns) { 101 c.setRowCount(rowCount); 102 } 103 fireTableStructureChanged(); 104 } 105 106 /* 107 * (non-Javadoc) 108 * @see javax.swing.table.TableModel#getValueAt(int, int) 109 */ 110 public Object getValueAt(int rowIndex, int columnIndex) { 111 if (columnIndex >= getColumnCount()) 112 throw new IllegalArgumentException("Column index should not exceed column count: " + columnIndex + " >= " + getColumnCount() + "."); 113 114 return columns.get(columnIndex).getValue(rowIndex); 115 } 116 117 /* 118 * (non-Javadoc) 119 * @see javax.swing.table.TableModel#isCellEditable(int, int) 120 */ 121 public boolean isCellEditable(int rowIndex, int columnIndex) { 122 return false; 123 } 124 125 /* 126 * (non-Javadoc) 127 * @see javax.swing.table.TableModel#setValueAt(java.lang.Object, int, int) 128 */ 129 public void setValueAt(Object aValue, int rowIndex, int columnIndex) { 130 //read only 131 } 132 133 /** 134 * Adds a new column to the model. Column is added as the most right one. 135 * 136 * @param column new column to be added 137 */ 138 public void addColumn(AcopTableColumn column) { 139 columns.add(column); 140 column.addTableColumnListener(this); 141 column.setRowCount(rowCount); 142 fireTableStructureChanged(); 143 } 144 145 /** 146 * Removes a column from the model. 147 * 148 * @param column the column to be removed 149 */ 150 public void removeColumn(AcopTableColumn column) { 151 columns.remove(column); 152 column.removeTableColumnListener(this); 153 fireTableStructureChanged(); 154 } 155 156 /* 157 * (non-Javadoc) 158 * @see de.desy.acop.displayers.tools.table.TableColumnListener#columnDataChanged(de.desy.acop.displayers.tools.table.TableColumnEvent) 159 */ 160 public void columnDataChanged(TableColumnEvent e) { 161 AcopTableColumn column = e.getColumn(); 162 int columnIndex = -1; 163 for (int i = 0; i < columns.size(); i++) { 164 if (column.equals(columns.get(i))) { 165 columnIndex = i; 166 } 167 } 168 169 if (columnIndex != -1){ 170 TableModelEvent event = new TableModelEvent(this, 0, rowCount, columnIndex); 171 fireTableChanged(event); 172 } 173 174 } 175 }