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}