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