001 /*
002 * $Id: StormTrackTableModel.java,v 1.1 2012/01/04 20:39:38 tommyj Exp $
003 *
004 * This file is part of McIDAS-V
005 *
006 * Copyright 2007-2012
007 * Space Science and Engineering Center (SSEC)
008 * University of Wisconsin - Madison
009 * 1225 W. Dayton Street, Madison, WI 53706, USA
010 * https://www.ssec.wisc.edu/mcidas
011 *
012 * All Rights Reserved
013 *
014 * McIDAS-V is built on Unidata's IDV and SSEC's VisAD libraries, and
015 * some McIDAS-V source code is based on IDV and VisAD source code.
016 *
017 * McIDAS-V is free software; you can redistribute it and/or modify
018 * it under the terms of the GNU Lesser Public License as published by
019 * the Free Software Foundation; either version 3 of the License, or
020 * (at your option) any later version.
021 *
022 * McIDAS-V is distributed in the hope that it will be useful,
023 * but WITHOUT ANY WARRANTY; without even the implied warranty of
024 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
025 * GNU Lesser Public License for more details.
026 *
027 * You should have received a copy of the GNU Lesser Public License
028 * along with this program. If not, see http://www.gnu.org/licenses.
029 */
030
031 package edu.wisc.ssec.mcidasv.control.cyclone;
032
033 import java.util.ArrayList;
034 import java.util.List;
035
036 import javax.swing.table.AbstractTableModel;
037
038 import ucar.unidata.data.storm.StormParam;
039 import ucar.unidata.data.storm.StormTrack;
040 import ucar.unidata.data.storm.StormTrackPoint;
041 import visad.Real;
042 import visad.Unit;
043 import visad.VisADException;
044
045 /**
046 *
047 * @author Unidata Development Team
048 * @version $Revision: 1.1 $
049 */
050
051 public class StormTrackTableModel extends AbstractTableModel {
052
053 /**
054 * default
055 */
056 private static final long serialVersionUID = 1L;
057
058 /** _more_ */
059 private StormDisplayState stormDisplayState;
060
061 /** _more_ */
062 private StormTrack track;
063
064 /** _more_ */
065 private List<StormTrackPoint> points;
066
067 /** _more_ */
068 private List<StormParam> params;
069
070 /**
071 * _more_
072 *
073 * @param stormDisplayState
074 * _more_
075 * @param track
076 * _more_
077 */
078 public StormTrackTableModel(StormDisplayState stormDisplayState,
079 StormTrack track) {
080 this.stormDisplayState = stormDisplayState;
081 this.track = track;
082 this.points = track.getTrackPoints();
083 List<StormParam> tmp = track.getParams();
084 this.params = new ArrayList<StormParam>();
085 for (StormParam param : tmp) {
086 if (!param.getDerived()) {
087 this.params.add(param);
088 }
089 }
090 }
091
092 /**
093 * _more_
094 *
095 * @param rowIndex
096 * _more_
097 * @param columnIndex
098 * _more_
099 *
100 * @return _more_
101 */
102 public boolean isCellEditable(int rowIndex, int columnIndex) {
103 // if (true) {
104 // return false;
105 // }
106 if (columnIndex == 0) {
107 return false;
108 }
109 // return stormDisplayState.getStormTrackControl().isEditable();
110 return stormDisplayState.getStormTrackControl().getEditMode();
111 }
112
113 /**
114 * _more_
115 *
116 * @return _more_
117 */
118 public StormTrack getStormTrack() {
119 return track;
120 }
121
122 /**
123 * _more_
124 *
125 * @return _more_
126 */
127 public int getRowCount() {
128 return points.size();
129 }
130
131 /**
132 * _more_
133 *
134 * @return _more_
135 */
136 public int getColumnCount() {
137 return 3 + params.size();
138 }
139
140 /**
141 * _more_
142 *
143 * @param aValue
144 * _more_
145 * @param rowIndex
146 * _more_
147 * @param column
148 * _more_
149 */
150 public void setValueAt(Object aValue, int rowIndex, int column) {
151 StormTrackPoint stp = points.get(rowIndex);
152 if (column == 0) {
153 return;
154 } else if (column == 1) {
155 // latitude
156 } else if (column == 2) {
157 // longitude
158 } else {
159 StormParam param = params.get(column - 3);
160 Real r = stp.getAttribute(param);
161 double newValue = new Double(aValue.toString()).doubleValue();
162 // Set the value
163 Real rr = null;
164 try {
165 rr = r.cloneButValue(newValue);
166
167 } catch (VisADException ep) {
168 }
169
170 stp.setAttribute(rr);
171 }
172 stormDisplayState.markHasBeenEdited();
173 }
174
175 /**
176 * _more_
177 *
178 * @param row
179 * _more_
180 * @param column
181 * _more_
182 *
183 * @return _more_
184 */
185 public Object getValueAt(int row, int column) {
186 if (row >= points.size()) {
187 return "";
188 }
189 StormTrackPoint stp = points.get(row);
190 if (column == 0) {
191 if (track.getWay().isObservation()) {
192 return stp.getTime();
193 }
194 return "" + stp.getForecastHour();
195 }
196 if (column == 1) {
197 return stp.getLocation().getLatitude();
198 }
199 if (column == 2) {
200 return stp.getLocation().getLongitude();
201 }
202 StormParam param = params.get(column - 3);
203 Real r = stp.getAttribute(param);
204 if (r != null) {
205 return r.toString();
206 }
207 return "";
208 }
209
210 /**
211 * _more_
212 *
213 * @param column
214 * _more_
215 *
216 * @return _more_
217 */
218 public String getColumnName(int column) {
219 if (column == 0) {
220 return track.getWay().isObservation() ? "Time" : "Hour";
221 }
222 if (column == 1) {
223 return "Lat";
224 }
225 if (column == 2) {
226 return "Lon";
227 }
228 StormParam param = params.get(column - 3);
229 Unit unit = param.getUnit();
230 return param.toString() + ((unit == null) ? "" : "[" + unit + "]");
231 }
232
233 }