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
044package org.jfree.data.time;
045
046import javax.swing.table.AbstractTableModel;
047
048import org.jfree.data.general.SeriesChangeEvent;
049import 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 */
055public 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}