/*
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();
}
}