001 /*
002 * This file is part of McIDAS-V
003 *
004 * Copyright 2007-2013
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
029 package edu.wisc.ssec.mcidasv.control.cyclone;
030
031 import java.awt.Color;
032 import java.awt.Dimension;
033 import java.awt.event.ActionEvent;
034 import java.awt.event.ActionListener;
035 import java.util.ArrayList;
036 import java.util.List;
037
038 import javax.swing.JButton;
039 import javax.swing.JComponent;
040 import javax.swing.JLabel;
041
042 import ucar.unidata.data.storm.StormTrack;
043 import ucar.unidata.util.GuiUtils;
044 import ucar.unidata.util.LogUtil;
045 import ucar.unidata.util.Misc;
046 import ucar.visad.Util;
047 import ucar.visad.display.StationModelDisplayable;
048 import ucar.visad.display.TrackDisplayable;
049 import visad.Data;
050 import visad.DateTime;
051 import visad.FieldImpl;
052
053 /**
054 *
055 * @author Unidata Development Team
056 * @version $Revision$
057 */
058
059 public class YearDisplayState {
060
061 /** _more_ */
062 public static final int STATE_INACTIVE = 0;
063
064 /** _more_ */
065 public static final int STATE_LOADING = 1;
066
067 /** _more_ */
068 public static final int STATE_ACTIVE = 2;
069
070 /** _more_ */
071 private static int[] nextColor = { 0 };
072
073 /** _more_ */
074 private StormTrackControl stormTrackControl;
075
076 /** _more_ */
077 private int year;
078
079 /** _more_ */
080 private Color color;
081
082 /** _more_ */
083 private int state = STATE_INACTIVE;
084
085 /** _more_ */
086 private TrackDisplayable trackDisplay;
087
088 /** _more_ */
089 private StationModelDisplayable labelDisplay;
090
091 /** _more_ */
092 private List<StormTrack> stormTracks = new ArrayList<StormTrack>();
093
094 /** _more_ */
095 private JLabel label;
096
097 /** _more_ */
098 private JButton button;
099
100 /** _more_ */
101 private GuiUtils.ColorSwatch colorSwatch;
102
103 /**
104 * _more_
105 */
106 public YearDisplayState() {
107 }
108
109 /**
110 * _more_
111 *
112 *
113 * @param stormTrackControl
114 * _more_
115 * @param year
116 * _more_
117 *
118 */
119 public YearDisplayState(StormTrackControl stormTrackControl, int year) {
120 this.stormTrackControl = stormTrackControl;
121 this.year = year;
122 color = StormDisplayState.getNextColor(nextColor);
123 }
124
125 /**
126 * _more_
127 *
128 * @return _more_
129 */
130 protected JComponent getColorSwatch() {
131 if (colorSwatch == null) {
132 colorSwatch = new GuiUtils.ColorSwatch(getColor(),
133 "Set track color") {
134 public void setBackground(Color newColor) {
135 super.setBackground(newColor);
136 YearDisplayState.this.color = newColor;
137 if (trackDisplay != null) {
138 try {
139 trackDisplay.setColor(newColor);
140 } catch (Exception exc) {
141 LogUtil.logException("Setting color", exc);
142 }
143 }
144 }
145 };
146 colorSwatch.setMinimumSize(new Dimension(15, 15));
147 colorSwatch.setPreferredSize(new Dimension(15, 15));
148 }
149 return colorSwatch;
150 }
151
152 /**
153 * _more_
154 *
155 * @return _more_
156 */
157 public String toString() {
158 return "" + year;
159 }
160
161 /** _more_ */
162 private List pointObs;
163
164 /**
165 * _more_
166 *
167 * @return _more_
168 */
169 protected List getPointObs() {
170 return pointObs;
171 }
172
173 /**
174 * _more_
175 *
176 * @param doYearTime
177 * _more_
178 * @param tracks
179 * _more_
180 * @param times
181 * _more_
182 * @param fields
183 * _more_
184 * @param pointObs
185 * _more_
186 *
187 * @throws Exception
188 * _more_
189 */
190 public void setData(boolean doYearTime, List<StormTrack> tracks,
191 List times, List fields, List pointObs) throws Exception {
192 this.pointObs = pointObs;
193 stormTracks.clear();
194 stormTracks.addAll(tracks);
195 if (trackDisplay == null) {
196 trackDisplay = new TrackDisplayable("year track ");
197 trackDisplay.setLineWidth(2);
198 stormTrackControl.addDisplayable(trackDisplay);
199 trackDisplay.setColor(color);
200 /*
201 * labelDisplay = new StationModelDisplayable("storm year labels");
202 * labelDisplay.setScale( stormTrackControl.getDisplayScale());
203 * StationModelManager smm =
204 * stormTrackControl.getControlContext().getStationModelManager();
205 * StationModel model = smm.getStationModel("Location");
206 * labelDisplay.setStationModel(model);
207 * stormTrackControl.addDisplayable(labelDisplay);
208 */
209 }
210
211 if (doYearTime) {
212 DateTime dttm = (DateTime) times.get(0);
213 trackDisplay.setOverrideAnimationSet(Misc.newList(dttm));
214 Data[] datas = (Data[]) fields.toArray(new Data[fields.size()]);
215 times = Misc.newList(new DateTime(dttm.cloneButValue(dttm
216 .getValue() - 1000)), dttm, new DateTime(dttm
217 .cloneButValue(dttm.getValue() + 1000)));
218 FieldImpl indexField = Util.indexedField(datas, false);
219 fields = Misc.newList(indexField, indexField, indexField);
220 trackDisplay.setTrack(Util.makeTimeField(fields, times));
221 // System.err.println ("field:" + Util.makeTimeField(fields,
222 // times));
223 } else {
224 trackDisplay.setOverrideAnimationSet((List) null);
225 trackDisplay.setTrack(Util.makeTimeField(fields, times));
226 // System.err.println ("no year");
227 // labelDisplay.setStationData(
228 // PointObFactory.makeTimeSequenceOfPointObs(pointObs, -1, -1));
229 }
230
231 }
232
233 /**
234 * _more_
235 *
236 * @return _more_
237 */
238 public JButton getButton() {
239 if (button == null) {
240 button = new JButton("");
241 GuiUtils.setFixedWidthFont(button);
242 setState(state);
243 button.addActionListener(new ActionListener() {
244 public void actionPerformed(ActionEvent ae) {
245 if (state == STATE_ACTIVE) {
246 state = STATE_INACTIVE;
247 unload();
248 } else if (state == STATE_LOADING) {
249 state = STATE_INACTIVE;
250 } else if (state == STATE_INACTIVE) {
251 state = STATE_LOADING;
252 stormTrackControl.loadYear(YearDisplayState.this);
253 }
254 setState(state);
255 }
256 });
257 }
258 return button;
259 }
260
261 /**
262 * _more_
263 *
264 * @param msg
265 * _more_
266 */
267 public void setStatus(String msg) {
268 getLabel().setText(msg);
269 }
270
271 /**
272 * _more_
273 *
274 * @return _more_
275 */
276 public JLabel getLabel() {
277 if (label == null) {
278 label = new JLabel("");
279 }
280 return label;
281 }
282
283 /**
284 * _more_
285 */
286 public void unload() {
287 if (trackDisplay != null) {
288 try {
289 stormTrackControl.removeDisplayable(trackDisplay);
290 if (labelDisplay != null) {
291 stormTrackControl.removeDisplayable(labelDisplay);
292 }
293 stormTrackControl.unloadYear(this);
294 } catch (Exception exc) {
295 LogUtil.logException("Unloading tracks", exc);
296 }
297 trackDisplay = null;
298 labelDisplay = null;
299 }
300 }
301
302 /**
303 * _more_
304 *
305 * @return _more_
306 */
307 public List<StormTrack> getStormTracks() {
308 return stormTracks;
309 }
310
311 /**
312 * _more_
313 *
314 * @return _more_
315 */
316 public StormTrackControl getStormTrackControl() {
317 return stormTrackControl;
318 }
319
320 /**
321 * _more_
322 *
323 * @param stormTrackControl
324 * _more_
325 */
326 public void setStormTrackControl(StormTrackControl stormTrackControl) {
327 this.stormTrackControl = stormTrackControl;
328 }
329
330 /**
331 * Set the Year property.
332 *
333 * @param value
334 * The new value for Year
335 */
336 public void setYear(int value) {
337 year = value;
338 }
339
340 /**
341 * Get the Year property.
342 *
343 * @return The Year
344 */
345 public int getYear() {
346 return year;
347 }
348
349 /**
350 * Set the Color property.
351 *
352 * @param value
353 * The new value for Color
354 */
355 public void setColor(Color value) {
356 color = value;
357 }
358
359 /**
360 * Get the Color property.
361 *
362 * @return The Color
363 */
364 public Color getColor() {
365 return color;
366 }
367
368 /**
369 * Get the Active property.
370 *
371 * @return The Active
372 */
373 public boolean getActive() {
374 return state == STATE_ACTIVE;
375 }
376
377 /**
378 * Set the State property.
379 *
380 * @param value
381 * The new value for State
382 */
383 public void setState(int value) {
384 state = value;
385 if (button != null) {
386 if (state == STATE_ACTIVE) {
387 button.setText("Unload");
388 } else if (state == STATE_LOADING) {
389 button.setText("Cancel");
390 } else if (state == STATE_INACTIVE) {
391 button.setText("Load ");
392 }
393 }
394 }
395
396 /**
397 * Get the State property.
398 *
399 * @return The State
400 */
401 public int getState() {
402 return state;
403 }
404
405 }