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 }