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 }