thanks, slider example

Hi,

Thanks to Steve Emmerson, Bill, and others, I have made some rapid
process with VisAD. I'd like to start giving something back by sharing a
little toy application that does a 2D line plot with a shape that moves
along the curve under the control of a slider. I tried to keep it to a
bare minimum. It has certainly been a learning experience for me and
hopefully it will help others.

OK, I do actually have a couple of questions:
1) Why won't the shape appear till after clicking on the slider? (It
worked for me before I "cleaned up" my code. I see the same problem in
some Test programs.)
2) Is there a convenient way to center the text shape thingy?
("center=true" seems to apply only to the horizontal)
3) Is my code a bunch of crap or am I catching on to this thing? Any
comments welcome.

Thanks,
Doug

-- 
*----------------------------------------------------------------------*
| Doug Lindholm, Software Engineer          |  E-mail: lind@xxxxxxxx   |
| Research Applications Program             |   Phone: 303-497-8374    |
| National Center for Atmospheric Research  |                          |
| P.O. Box 3000                             |     There's no place     |
| Boulder, Colorado 80307-3000              |        like $HOME        |
*----------------------------------------------------------------------*

import java.rmi.RemoteException;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import visad.*;
import visad.java2d.*;
import java.lang.Math;
import visad.util.VisADSlider;

public class Plot2D
{

  public DisplayImpl display;

  public static void main(String[] args)
        throws Exception
  {

    Plot2D plot = new Plot2D();

  }

  public Plot2D()
       throws Exception
  {

    //--- define types ---//

    RealType x = new RealType("x",null,null);
    RealType y = new RealType("y",null,null);
    RealType shape = new RealType("shape",null,null);
    RealTupleType pos = new RealTupleType(x,y);
    RealType time_type = RealType.Time;

    FunctionType ftype = new FunctionType(x,y);
    FunctionType ftype2 = new FunctionType(pos,shape);
    FunctionType time_ftype = new FunctionType(time_type,ftype2);

    //--- define data implementations ---//

    int n = 100;
    FlatField field = new FlatField(ftype, new Integer1DSet(n));
    double[][] data = new double[1][n];
    for (int i=0;i<n;i++) {
      data[0][i] = Math.sin(i/10.0);
    }
    field.setSamples(data);

    Set time_set = new Linear1DSet(time_type, 0.0, 100.0, n);
    FieldImpl time_sequence = new FieldImpl(time_ftype, time_set);
    float[][] coords = new float[2][1];
    Gridded2DSet set2;
    FlatField field2;
    double[][] data2 = new double[1][1];
    for (int i=0;i<n;i++) {
      coords[0][0] = 1.0f * i;
      coords[1][0] = (float) ((Real) field.getSample(i)).getValue();
      set2 = new Gridded2DSet(pos, coords, 1,1);
      field2 = new FlatField(ftype2,set2);
      field2.setSamples(data2);
      time_sequence.setSample(i,field2);
    }

    //--- map data to display ---//
    display = new DisplayImplJ2D("display"); 
    display.addMap(new ScalarMap(x, Display.XAxis));
    display.addMap(new ScalarMap(y, Display.YAxis));

    ScalarMap sm_shape = new ScalarMap(shape, Display.Shape);
    display.addMap(sm_shape);

    ScalarMap sm = new ScalarMap(RealType.Time, Display.SelectValue);
    display.addMap(sm);

    //--- Shape ---//
    double[] start = {0.0, 0.0, 0.0};
    double[] base = {1.0, 0.0, 0.0};
    double[] up = {0.0, 1.0, 0.0};
    boolean center = true;
    VisADLineArray[] shapes = new VisADLineArray[1];
    shapes[0] = PlotText.render_label("X", start, base, up, center);

    ShapeControl shape_control = (ShapeControl) sm_shape.getControl();
    shape_control.setShapeSet(new Integer1DSet(1));
    shape_control.setShapes(shapes);
    display.addMap(new ConstantMap(0.1, Display.ShapeScale));

    //--- Slider ---//
    final ValueControl vc = (ValueControl) sm.getControl();
    vc.setValue(50.0); //???
    final DataReference value_ref = new DataReferenceImpl("value");
    VisADSlider slider
      new VisADSlider("value", 0, 100, 0, 1.0, value_ref,
RealType.Generic);

    CellImpl cell = new CellImpl() {
      public void doAction() throws VisADException, RemoteException {
        vc.setValue(((Real) value_ref.getData()).getValue());
      }
    };
    cell.addReference(value_ref);

    //--- add data references to display ---//
    DataReferenceImpl ref = new DataReferenceImpl("ref");
    ref.setData(field);
    display.addReference(ref, null);
    DataReferenceImpl ref2 = new DataReferenceImpl("ref2");
    ref2.setData(time_sequence);
    display.addReference(ref2, null);

    //--- create display window ---//

    JFrame frame = new JFrame("Simple VisAD Application");
    frame.addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent e) {System.exit(0);}
    });

    JPanel panel = new JPanel();
    panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
    panel.setAlignmentY(JPanel.TOP_ALIGNMENT);
    panel.setAlignmentX(JPanel.LEFT_ALIGNMENT);
    frame.getContentPane().add(panel);

    //--- add stuff to window ---//
    panel.add(display.getComponent());
    panel.add(slider);

    //--- set size and make it visible ---//
    frame.setSize(300, 300);
    frame.setVisible(true);

  }

}