View Javadoc

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 }