/*
VisAD system for interactive analysis and visualization of numerical
data.  Copyright (C) 1996 - 2017 Bill Hibbard, Curtis Rueden, Tom
Rink, Dave Glowacki, Steve Emmerson, Tom Whittaker, Don Murray, and
Tommy Jasmin.

This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.

This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Library General Public License for more details.

You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
MA 02111-1307, USA
*/

package visad.data.amanda;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.FlowLayout;

import java.rmi.RemoteException;

import javax.swing.JLabel;
import javax.swing.JPanel;

import visad.ControlEvent;
import visad.ControlListener;
import visad.DataReferenceImpl;
import visad.FieldImpl;
import visad.PlotText;
import visad.ScalarMap;
import visad.ScalarMapControlEvent;
import visad.ScalarMapEvent;
import visad.ScalarMapListener;
import visad.ValueControl;
import visad.VisADException;

import visad.util.VisADSlider;

public class TrackWidget
  extends JPanel
  implements ControlListener, ScalarMapListener
{
  private ScalarMap map;
  private DataReferenceImpl ref;

  private Event event;

  private int trackIndex;

  private JLabel lengthLabel, energyLabel;

  public TrackWidget(ScalarMap map, DataReferenceImpl ref)
    throws RemoteException, VisADException
  {
    super();

    ValueControl ctl = (ValueControl )map.getControl();
    ctl.addControlListener(this);

    this.map = map;
    this.ref = ref;
    this.event = null;
    this.trackIndex = (int )ctl.getValue();

    setLayout(new BorderLayout());

    Component labels = buildLabels();

    VisADSlider trackSlider = new VisADSlider(map, true, true);
    trackSlider.hardcodeSizePercent(110); // leave room for label changes

    add(trackSlider, BorderLayout.NORTH);
    add(labels, BorderLayout.SOUTH);
  }

  public Component buildLabels()
  {
    JPanel panel = new JPanel();
    panel.setLayout(new FlowLayout());

    lengthLabel = new JLabel("WWWWWW.WWWW");
    lengthLabel.setMinimumSize(lengthLabel.getSize());
    energyLabel = new JLabel("WWWWWW.WWWW");
    energyLabel.setMinimumSize(energyLabel.getSize());

    panel.add(new JLabel("  Length: "));
    panel.add(lengthLabel);
    panel.add(new JLabel("  Energy: "));
    panel.add(energyLabel);

    return panel;
  }

  private void changeControl(ValueControl ctl)
  {
    if (event == null) {
      trackChanged(null);
    } else {
      trackIndex = (int )ctl.getValue();

      trackChanged(event.getTrack(trackIndex));
    }
  }

  public void controlChanged(ControlEvent evt)
  {
    changeControl((ValueControl )evt.getControl());
  }

  public void controlChanged(ScalarMapControlEvent evt)
  {
    changeControl((ValueControl )evt.getControl());
  }

  private static final String floatString(float val)
  {
    if (val == Float.POSITIVE_INFINITY) {
      return "inf";
    } else if (val == Float.NEGATIVE_INFINITY) {
      return "-inf";
    } else if (val == Float.NaN) {
      return "?";
    }

    return PlotText.shortString(val);
  }

  public void mapChanged(ScalarMapEvent evt)
  {
    System.err.println(evt);
  }

  public void setEvent(Event evt)
    throws RemoteException, VisADException
  {
    this.event = evt;
    if (event == null) {
      trackChanged(null);
    } else {
      map.setRange(0.0, (double )event.getNumberOfTracks());
      trackChanged(event.getTrack(trackIndex));
    }
  }

  private void trackChanged(BaseTrack track)
  {
    final FieldImpl trackSeq;

    if (track == null) {
      lengthLabel.setText("");
      energyLabel.setText("");

      trackSeq = BaseTrack.missing;
    } else {
      lengthLabel.setText(floatString(track.getLength()));
      energyLabel.setText(floatString(track.getEnergy()));

      trackSeq = event.makeTrackSequence(trackIndex);
    }

    try {
      ref.setData(trackSeq);
    } catch (RemoteException re) {
      re.printStackTrace();
    } catch (VisADException ve) {
      ve.printStackTrace();
    }

    this.invalidate();
  }
}

 

Ads help maintain this website.