001 /* ===========================================================
002 * JFreeChart : a free chart library for the Java(tm) platform
003 * ===========================================================
004 *
005 * (C) Copyright 2000-2005, 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-2005, by Object Refinery Limited.
031 *
032 * Original Author: David Gilbert (for Object Refinery Limited);
033 * Contributor(s): -;
034 *
035 * $Id: TimeSeriesTableModel.java,v 1.3.2.1 2005/10/25 21:35:24 mungady Exp $
036 *
037 * Changes
038 * -------
039 * 14-Nov-2001 : Version 1 (DG);
040 * 05-Apr-2002 : Removed redundant first column (DG);
041 * 24-Jun-2002 : Removed unnecessary local variable (DG);
042 * 07-Oct-2002 : Fixed errors reported by Checkstyle (DG);
043 *
044 */
045
046 package org.jfree.data.time;
047
048 import javax.swing.table.AbstractTableModel;
049
050 import org.jfree.data.general.SeriesChangeEvent;
051 import org.jfree.data.general.SeriesChangeListener;
052
053 /**
054 * Wrapper around a time series to convert it to a table model for use in
055 * a <code>JTable</code>.
056 */
057 public class TimeSeriesTableModel extends AbstractTableModel
058 implements SeriesChangeListener {
059
060 /** The series. */
061 private TimeSeries series;
062
063 /** A flag that controls whether the series is editable. */
064 private boolean editable;
065
066 /** The new time period. */
067 private RegularTimePeriod newTimePeriod;
068
069 /** The new value. */
070 private Number newValue;
071
072 /**
073 * Default constructor.
074 */
075 public TimeSeriesTableModel() {
076 this(new TimeSeries("Untitled"));
077 }
078
079 /**
080 * Constructs a table model for a time series.
081 *
082 * @param series the time series.
083 */
084 public TimeSeriesTableModel(TimeSeries series) {
085 this(series, false);
086 }
087
088 /**
089 * Creates a table model based on a time series.
090 *
091 * @param series the time series.
092 * @param editable if <ocde>true</code>, the table is editable.
093 */
094 public TimeSeriesTableModel(TimeSeries series, boolean editable) {
095 this.series = series;
096 this.series.addChangeListener(this);
097 this.editable = editable;
098 }
099
100 /**
101 * Returns the number of columns in the table model. For this particular
102 * model, the column count is fixed at 2.
103 *
104 * @return The column count.
105 */
106 public int getColumnCount() {
107 return 2;
108 }
109
110 /**
111 * Returns the column class in the table model.
112 *
113 * @param column The column index.
114 *
115 * @return The column class in the table model.
116 */
117 public Class getColumnClass(int column) {
118 if (column == 0) {
119 return String.class;
120 }
121 else {
122 if (column == 1) {
123 return Double.class;
124 }
125 else {
126 return null;
127 }
128 }
129 }
130
131 /**
132 * Returns the name of a column
133 *
134 * @param column the column index.
135 *
136 * @return The name of a column.
137 */
138 public String getColumnName(int column) {
139
140 if (column == 0) {
141 return "Period:";
142 }
143 else {
144 if (column == 1) {
145 return "Value:";
146 }
147 else {
148 return null;
149 }
150 }
151
152 }
153
154 /**
155 * Returns the number of rows in the table model.
156 *
157 * @return The row count.
158 */
159 public int getRowCount() {
160 return this.series.getItemCount();
161 }
162
163 /**
164 * Returns the data value for a cell in the table model.
165 *
166 * @param row the row number.
167 * @param column the column number.
168 *
169 * @return The data value for a cell in the table model.
170 */
171 public Object getValueAt(int row, int column) {
172
173 if (row < this.series.getItemCount()) {
174 if (column == 0) {
175 return this.series.getTimePeriod(row);
176 }
177 else {
178 if (column == 1) {
179 return this.series.getValue(row);
180 }
181 else {
182 return null;
183 }
184 }
185 }
186 else {
187 if (column == 0) {
188 return this.newTimePeriod;
189 }
190 else {
191 if (column == 1) {
192 return this.newValue;
193 }
194 else {
195 return null;
196 }
197 }
198 }
199
200 }
201
202 /**
203 * Returns a flag indicating whether or not the specified cell is editable.
204 *
205 * @param row the row number.
206 * @param column the column number.
207 *
208 * @return <code>true</code> if the specified cell is editable.
209 */
210 public boolean isCellEditable(int row, int column) {
211 if (this.editable) {
212 if ((column == 0) || (column == 1)) {
213 return true;
214 }
215 else {
216 return false;
217 }
218 }
219 else {
220 return false;
221 }
222 }
223
224 /**
225 * Updates the time series.
226 *
227 * @param value the new value.
228 * @param row the row.
229 * @param column the column.
230 */
231 public void setValueAt(Object value, int row, int column) {
232
233 if (row < this.series.getItemCount()) {
234
235 // update the time series appropriately
236 if (column == 1) {
237 try {
238 Double v = Double.valueOf(value.toString());
239 this.series.update(row, v);
240
241 }
242 catch (NumberFormatException nfe) {
243 System.err.println("Number format exception");
244 }
245 }
246 }
247 else {
248 if (column == 0) {
249 // this.series.getClass().valueOf(value.toString());
250 this.newTimePeriod = null;
251 }
252 else if (column == 1) {
253 this.newValue = Double.valueOf(value.toString());
254 }
255 }
256 }
257
258 /**
259 * Receives notification that the time series has been changed. Responds
260 * by firing a table data change event.
261 *
262 * @param event the event.
263 */
264 public void seriesChanged(SeriesChangeEvent event) {
265 fireTableDataChanged();
266 }
267
268 }