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