001 /* ===========================================================
002 * JFreeChart : a free chart library for the Java(tm) platform
003 * ===========================================================
004 *
005 * (C) Copyright 2000-2008, by Object Refinery Limited and Contributors.
006 *
007 * Project Info: http://www.jfree.org/jfreechart/index.html
008 *
009 * This library is free software; you can redistribute it and/or modify it
010 * under the terms of the GNU Lesser General Public License as published by
011 * the Free Software Foundation; either version 2.1 of the License, or
012 * (at your option) any later version.
013 *
014 * This library is distributed in the hope that it will be useful, but
015 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
016 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
017 * License for more details.
018 *
019 * You should have received a copy of the GNU Lesser General Public
020 * License along with this library; if not, write to the Free Software
021 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
022 * USA.
023 *
024 * [Java is a trademark or registered trademark of Sun Microsystems, Inc.
025 * in the United States and other countries.]
026 *
027 * -------------------------
028 * TimeSeriesTableModel.java
029 * -------------------------
030 * (C) Copyright 2001-2008, by Object Refinery Limited.
031 *
032 * Original Author: David Gilbert (for Object Refinery Limited);
033 * Contributor(s): -;
034 *
035 * Changes
036 * -------
037 * 14-Nov-2001 : Version 1 (DG);
038 * 05-Apr-2002 : Removed redundant first column (DG);
039 * 24-Jun-2002 : Removed unnecessary local variable (DG);
040 * 07-Oct-2002 : Fixed errors reported by Checkstyle (DG);
041 *
042 */
043
044 package org.jfree.data.time;
045
046 import javax.swing.table.AbstractTableModel;
047
048 import org.jfree.data.general.SeriesChangeEvent;
049 import org.jfree.data.general.SeriesChangeListener;
050
051 /**
052 * Wrapper around a time series to convert it to a table model for use in
053 * a <code>JTable</code>.
054 */
055 public class TimeSeriesTableModel extends AbstractTableModel
056 implements SeriesChangeListener {
057
058 /** The series. */
059 private TimeSeries series;
060
061 /** A flag that controls whether the series is editable. */
062 private boolean editable;
063
064 /** The new time period. */
065 private RegularTimePeriod newTimePeriod;
066
067 /** The new value. */
068 private Number newValue;
069
070 /**
071 * Default constructor.
072 */
073 public TimeSeriesTableModel() {
074 this(new TimeSeries("Untitled"));
075 }
076
077 /**
078 * Constructs a table model for a time series.
079 *
080 * @param series the time series.
081 */
082 public TimeSeriesTableModel(TimeSeries series) {
083 this(series, false);
084 }
085
086 /**
087 * Creates a table model based on a time series.
088 *
089 * @param series the time series.
090 * @param editable if <ocde>true</code>, the table is editable.
091 */
092 public TimeSeriesTableModel(TimeSeries series, boolean editable) {
093 this.series = series;
094 this.series.addChangeListener(this);
095 this.editable = editable;
096 }
097
098 /**
099 * Returns the number of columns in the table model. For this particular
100 * model, the column count is fixed at 2.
101 *
102 * @return The column count.
103 */
104 public int getColumnCount() {
105 return 2;
106 }
107
108 /**
109 * Returns the column class in the table model.
110 *
111 * @param column The column index.
112 *
113 * @return The column class in the table model.
114 */
115 public Class getColumnClass(int column) {
116 if (column == 0) {
117 return String.class;
118 }
119 else {
120 if (column == 1) {
121 return Double.class;
122 }
123 else {
124 return null;
125 }
126 }
127 }
128
129 /**
130 * Returns the name of a column
131 *
132 * @param column the column index.
133 *
134 * @return The name of a column.
135 */
136 public String getColumnName(int column) {
137
138 if (column == 0) {
139 return "Period:";
140 }
141 else {
142 if (column == 1) {
143 return "Value:";
144 }
145 else {
146 return null;
147 }
148 }
149
150 }
151
152 /**
153 * Returns the number of rows in the table model.
154 *
155 * @return The row count.
156 */
157 public int getRowCount() {
158 return this.series.getItemCount();
159 }
160
161 /**
162 * Returns the data value for a cell in the table model.
163 *
164 * @param row the row number.
165 * @param column the column number.
166 *
167 * @return The data value for a cell in the table model.
168 */
169 public Object getValueAt(int row, int column) {
170
171 if (row < this.series.getItemCount()) {
172 if (column == 0) {
173 return this.series.getTimePeriod(row);
174 }
175 else {
176 if (column == 1) {
177 return this.series.getValue(row);
178 }
179 else {
180 return null;
181 }
182 }
183 }
184 else {
185 if (column == 0) {
186 return this.newTimePeriod;
187 }
188 else {
189 if (column == 1) {
190 return this.newValue;
191 }
192 else {
193 return null;
194 }
195 }
196 }
197
198 }
199
200 /**
201 * Returns a flag indicating whether or not the specified cell is editable.
202 *
203 * @param row the row number.
204 * @param column the column number.
205 *
206 * @return <code>true</code> if the specified cell is editable.
207 */
208 public boolean isCellEditable(int row, int column) {
209 if (this.editable) {
210 if ((column == 0) || (column == 1)) {
211 return true;
212 }
213 else {
214 return false;
215 }
216 }
217 else {
218 return false;
219 }
220 }
221
222 /**
223 * Updates the time series.
224 *
225 * @param value the new value.
226 * @param row the row.
227 * @param column the column.
228 */
229 public void setValueAt(Object value, int row, int column) {
230
231 if (row < this.series.getItemCount()) {
232
233 // update the time series appropriately
234 if (column == 1) {
235 try {
236 Double v = Double.valueOf(value.toString());
237 this.series.update(row, v);
238
239 }
240 catch (NumberFormatException nfe) {
241 System.err.println("Number format exception");
242 }
243 }
244 }
245 else {
246 if (column == 0) {
247 // this.series.getClass().valueOf(value.toString());
248 this.newTimePeriod = null;
249 }
250 else if (column == 1) {
251 this.newValue = Double.valueOf(value.toString());
252 }
253 }
254 }
255
256 /**
257 * Receives notification that the time series has been changed. Responds
258 * by firing a table data change event.
259 *
260 * @param event the event.
261 */
262 public void seriesChanged(SeriesChangeEvent event) {
263 fireTableDataChanged();
264 }
265
266 }