Package com.bbn.openmap.layer.test

Source Code of com.bbn.openmap.layer.test.TestLayer$GraphicBase

// **********************************************************************
//
// <copyright>
//
//  BBN Technologies
//  10 Moulton Street
//  Cambridge, MA 02138
//  (617) 873-8000
//
//  Copyright (C) BBNT Solutions LLC. All rights reserved.
//
// </copyright>
// **********************************************************************
//
// $Source: /cvs/distapps/openmap/src/openmap/com/bbn/openmap/layer/test/TestLayer.java,v $
// $RCSfile: TestLayer.java,v $
// $Revision: 1.4.2.2 $
// $Date: 2005/08/09 21:17:55 $
// $Author: dietrick $
//
// **********************************************************************

package com.bbn.openmap.layer.test;

import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.event.MouseEvent;
import java.util.StringTokenizer;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JRootPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

import com.bbn.openmap.event.MapMouseListener;
import com.bbn.openmap.event.NavMouseMode;
import com.bbn.openmap.event.NullMouseMode;
import com.bbn.openmap.event.SelectMouseMode;
import com.bbn.openmap.layer.OMGraphicHandlerLayer;
import com.bbn.openmap.omGraphics.OMArrowHead;
import com.bbn.openmap.omGraphics.OMCircle;
import com.bbn.openmap.omGraphics.OMGraphic;
import com.bbn.openmap.omGraphics.OMGraphicList;
import com.bbn.openmap.omGraphics.OMLine;
import com.bbn.openmap.omGraphics.OMPoly;
import com.bbn.openmap.omGraphics.OMRect;
import com.bbn.openmap.omGraphics.OMText;
import com.bbn.openmap.proj.Length;
import com.bbn.openmap.util.Debug;
import com.bbn.openmap.util.PaletteHelper;

/**
* A Layer for testing different types of graphics. The GUI code is
* very large and ugly. Maybe break this off into several classes.
* <p>
* This layer responds to the following properties: <code><pre>
*
*  # initial visibility settings:
*  test.line.visible=true
*  test.circ.visible=true
*  test.rect.visible=true
*  test.text.visible=true
*  test.poly.visible=true
*  # latlon vertices of the poly
*  #test.poly.vertices=80 -180 80 -90 80 0 80 90 80 180 70 180 70 90 70 0 70 -90 70 -180
* </pre></code> In addition, you can get this layer to work with the
* OpenMap viewer by editing your openmap.properties file: <code><pre>
*
*  # layers
*  openmap.layers=test ...
*  # class
*  test.class=com.bbn.openmap.layer.TestLayer
*  # name
*  test.prettyName=Graticule
* </pre></code>
*/
public class TestLayer extends OMGraphicHandlerLayer implements
        MapMouseListener {

    public final static transient String LineVisibleProperty = ".line.visible";
    public final static transient String CircVisibleProperty = ".circ.visible";
    public final static transient String RectVisibleProperty = ".rect.visible";
    public final static transient String TextVisibleProperty = ".text.visible";
    public final static transient String PolyVisibleProperty = ".poly.visible";
    public final static transient String PolyVertsProperty = ".poly.vertices";

    // colors
    protected final static transient String[] colorNames = new String[] {
            "white", "lightGray", "gray", "darkGray", "black", "red", "pink",
            "orange", "yellow", "green", "magenta", "cyan", "blue", "clear" };
    protected final static transient Color[] colors = new Color[] {
            Color.white, Color.lightGray, Color.gray, Color.darkGray,
            Color.black, Color.red, Color.pink, Color.orange, Color.yellow,
            Color.green, Color.magenta, Color.cyan, Color.blue, OMGraphic.clear };
    protected final static transient int NCOLORS = colors.length;

    // graphics and peers
    protected OMCircle omcircle = new OMCircle();
    protected Circle circle = new Circle();

    protected OMLine omline = new OMLine();
    protected Line line = new Line();

    protected OMRect omrect = new OMRect();
    protected Rect rect = new Rect();

    protected OMText omtext = new OMText();
    protected Text text = new Text();

    protected OMPoly ompoly = new OMPoly();
    protected Poly poly = new Poly();

    protected JPanel gui = null;// the GUI

    /**
     * Construct the TestLayer.
     */
    public TestLayer() {}

    /**
     * The properties and prefix are managed and decoded here, for the
     * standard uses of the GraticuleLayer.
     *
     * @param prefix string prefix used in the properties file for
     *        this layer.
     * @param properties the properties set in the properties file.
     */
    public void setProperties(String prefix, java.util.Properties properties) {
        super.setProperties(prefix, properties);

        line.visible = Boolean.valueOf(properties.getProperty(prefix
                + LineVisibleProperty, "true")).booleanValue();

        circle.visible = Boolean.valueOf(properties.getProperty(prefix
                + CircVisibleProperty, "true")).booleanValue();

        rect.visible = Boolean.valueOf(properties.getProperty(prefix
                + RectVisibleProperty, "true")).booleanValue();

        text.visible = Boolean.valueOf(properties.getProperty(prefix
                + TextVisibleProperty, "true")).booleanValue();

        poly.visible = Boolean.valueOf(properties.getProperty(prefix
                + PolyVisibleProperty, "true")).booleanValue();

        String verts = properties.getProperty(prefix + PolyVertsProperty);
        if (verts != null) {
            poly.setVertices(verts);
        }
    }

    public synchronized OMGraphicList prepare() {
        if (getList() == null) {
            setList(generateGraphics());
        }
        return super.prepare();
    }

    /**
     * Create and project the graphics.
     */
    protected OMGraphicList generateGraphics() {
        OMGraphicList graphics = new OMGraphicList();

        // create OMLine from internal line representation
        switch (line.rt) {
        case OMGraphic.RENDERTYPE_LATLON:
            omline = new OMLine(line.llpts[0], line.llpts[1], line.llpts[2], line.llpts[3], line.type, line.nsegs);
            break;
        case OMGraphic.RENDERTYPE_XY:
            omline = new OMLine(line.xypts[0], line.xypts[1], line.xypts[2], line.xypts[3]);
            break;
        case OMGraphic.RENDERTYPE_OFFSET:
            omline = new OMLine(line.llpts[0], line.llpts[1], line.xypts[0], line.xypts[1], line.xypts[2], line.xypts[3]);
            break;
        default:
            System.err.println("ARRRR!");
            break;
        }
        if (line.arrowhead) {
            omline.addArrowHead(line.arrowtype);
        }

        // create OMCircle from internal circle representation
        switch (circle.rt) {
        case OMGraphic.RENDERTYPE_LATLON:
            omcircle = new OMCircle(circle.llpts[0], circle.llpts[1], circle.radius, Length.KM, circle.nsegs);
            omcircle.setPolarCorrection(true);
            break;
        case OMGraphic.RENDERTYPE_XY:
            omcircle = new OMCircle(circle.xypts[0], circle.xypts[1], circle.width, circle.height);
            break;
        case OMGraphic.RENDERTYPE_OFFSET:
            omcircle = new OMCircle(circle.llpts[0], circle.llpts[1], circle.xypts[0], circle.xypts[1], circle.width, circle.height);
            break;
        default:
            System.err.println("ARRRR!");
            break;
        }

        // create OMRect from internal rect representation
        switch (rect.rt) {
        case OMGraphic.RENDERTYPE_LATLON:
            omrect = new OMRect(rect.llpts[0], rect.llpts[1], rect.llpts[2], rect.llpts[3], rect.type, rect.nsegs);
            break;
        case OMGraphic.RENDERTYPE_XY:
            omrect = new OMRect(rect.xypts[0], rect.xypts[1], rect.xypts[2], rect.xypts[3]);
            break;
        case OMGraphic.RENDERTYPE_OFFSET:
            omrect = new OMRect(rect.llpts[0], rect.llpts[1], rect.xypts[0], rect.xypts[1], rect.xypts[2], rect.xypts[3]);
            break;
        default:
            System.err.println("ARRRR!");
            break;
        }

        // create OMText from internal text representation
        switch (text.rt) {
        case OMGraphic.RENDERTYPE_LATLON:
            omtext = new OMText(text.llpts[0], text.llpts[1], text.data, Font.decode(text.font), text.just);
            break;
        case OMGraphic.RENDERTYPE_XY:
            omtext = new OMText(text.xypts[0], text.xypts[1], text.data, Font.decode(text.font), text.just);
            break;
        case OMGraphic.RENDERTYPE_OFFSET:
            omtext = new OMText(text.llpts[0], text.llpts[1], text.xypts[0], text.xypts[1], text.data, Font.decode(text.font), text.just);
            break;
        default:
            System.err.println("ARRRR!");
            break;
        }

        // create OMPoly from internal poly representation
        switch (poly.rt) {
        case OMGraphic.RENDERTYPE_LATLON:
            int len = poly.llpts.length;
            float[] llpts = new float[len];
            System.arraycopy(poly.llpts, 0, llpts, 0, len);
            ompoly = new OMPoly(llpts, OMPoly.DECIMAL_DEGREES, poly.type, poly.nsegs);
            break;
        case OMGraphic.RENDERTYPE_XY:
            ompoly = new OMPoly(poly.xypts);
            break;
        case OMGraphic.RENDERTYPE_OFFSET:
            ompoly = new OMPoly(poly.lat, poly.lon, poly.xypts, poly.cMode);
            break;
        default:
            System.err.println("ARRRR!");
            break;
        }

        // generic
        omline.setVisible(line.visible);
        omline.setLinePaint(colors[line.lineColor]);
        omcircle.setVisible(circle.visible);
        omcircle.setLinePaint(colors[circle.lineColor]);
        omrect.setVisible(rect.visible);
        omrect.setLinePaint(colors[rect.lineColor]);
        ompoly.setVisible(poly.visible);
        ompoly.setLinePaint(colors[poly.lineColor]);
        omtext.setVisible(text.visible);
        omtext.setLinePaint(colors[text.lineColor]);
        if (circle.isFilled)
            omcircle.setFillPaint(colors[circle.fillColor]);
        if (rect.isFilled)
            omrect.setFillPaint(colors[rect.fillColor]);
        if (poly.isFilled)
            ompoly.setFillPaint(colors[poly.fillColor]);

        graphics.add(omline);
        graphics.add(omcircle);
        graphics.add(omrect);
        graphics.add(omtext);
        graphics.add(ompoly);
        graphics.generate(getProjection());

        return graphics;
    }

    /**
     * Gets the palette associated with the layer.
     * <p>
     *
     * @return Component or null
     */
    public Component getGUI() {
        if (gui == null) {
            JPanel pal;

            gui = PaletteHelper.createPaletteJPanel("Test");
            GridBagLayout gridbag = new GridBagLayout();
            GridBagConstraints constraints = new GridBagConstraints();
            gui.setLayout(gridbag);
            constraints.fill = GridBagConstraints.HORIZONTAL; // fill
                                                              // horizontally
            constraints.gridwidth = GridBagConstraints.REMAINDER; //another
                                                                  // row
            constraints.anchor = GridBagConstraints.EAST; // tack to
                                                          // the left
                                                          // edge
            //          constraints.weightx = 0.0;

            ActionListener al = new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    int index = Integer.parseInt(e.getActionCommand(), 10);
                    switch (index) {
                    case 0:
                        line.visible = !line.visible;
                        omline.setVisible(line.visible);
                        repaint();
                        break;
                    case 1:
                        circle.visible = !circle.visible;
                        omcircle.setVisible(circle.visible);
                        repaint();
                        break;
                    case 2:
                        rect.visible = !rect.visible;
                        omrect.setVisible(rect.visible);
                        repaint();
                        break;
                    case 3:
                        text.visible = !text.visible;
                        omtext.setVisible(text.visible);
                        repaint();
                        break;
                    case 4:
                        poly.visible = !poly.visible;
                        ompoly.setVisible(poly.visible);
                        repaint();
                        break;
                    default:
                        System.out.println("TestLayer: Unimplemented...");
                    }
                }
            };
            pal = PaletteHelper.createCheckbox("Graphics", new String[] {
                    "Line", "Circle", "Rect", "Text", "Poly" }, new boolean[] {
                    line.visible, circle.visible, rect.visible, text.visible,
                    poly.visible }, al);
            gridbag.setConstraints(pal, constraints);
            gui.add(pal);

            // line controls
            pal = getGraphicPalette(line, "Line");
            gridbag.setConstraints(pal, constraints);
            gui.add(pal);

            // circle controls
            pal = getGraphicPalette(circle, "Circle");
            gridbag.setConstraints(pal, constraints);
            gui.add(pal);

            // rect controls
            pal = getGraphicPalette(rect, "Rect");
            gridbag.setConstraints(pal, constraints);
            gui.add(pal);

            // text controls
            pal = getGraphicPalette(text, "Text");
            gridbag.setConstraints(pal, constraints);
            gui.add(pal);

            // poly controls
            pal = getGraphicPalette(poly, "Poly");
            gridbag.setConstraints(pal, constraints);
            gui.add(pal);
        }
        return gui;
    }

    /**
     * Create the sub-palette for a particular graphic type.
     *
     * @param obj GraphicObj
     * @param title panel title
     * @return JPanel sub-palette
     */
    protected JPanel getGraphicPalette(final GraphicBase obj, final String title) {

        final JComboBox jcb;
        final JFrame jframe;
        final JRootPane main;
        final JPanel parent;

        parent = PaletteHelper.createVerticalPanel(title);
        jframe = new JFrame();
        main = jframe.getRootPane();

        // different controls for different render types
        jcb = new JComboBox();
        jcb.addItem("LatLon");// indices correspond to LineType.java
        jcb.addItem("XY");
        jcb.addItem("Offset");
        jcb.setSelectedIndex(obj.rt - 1);
        jcb.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                obj.setRender(jcb);
                switch (obj.rt) {
                case OMGraphic.RENDERTYPE_LATLON:
                    jframe.setTitle(title + " - LatLon");
                    main.getContentPane().removeAll();
                    main.getContentPane().add(obj.getGUI());
                    jframe.pack();
                    jframe.setVisible(true);
                    break;
                case OMGraphic.RENDERTYPE_XY:
                    jframe.setTitle(title + " - XY");
                    main.getContentPane().removeAll();
                    main.getContentPane().add(obj.getGUI());
                    jframe.pack();
                    jframe.setVisible(true);
                    break;
                case OMGraphic.RENDERTYPE_OFFSET:
                    jframe.setTitle(title + " - XY Offset");
                    main.getContentPane().removeAll();
                    main.getContentPane().add(obj.getGUI());
                    jframe.pack();
                    jframe.setVisible(true);
                    break;
                default:
                    System.err.println("ARRRR!");
                    break;
                }
            }
        });
        parent.add(jcb);

        return parent;
    }

    /**
     * Returns self as the <code>MapMouseListener</code> in order to
     * receive <code>MapMouseEvent</code>s. If the implementation
     * would prefer to delegate <code>MapMouseEvent</code>s, it
     * could return the delegate from this method instead.
     *
     * @return MapMouseListener this
     */
    public MapMouseListener getMapMouseListener() {
        return this;
    }

    /**
     * Return a list of the modes that are interesting to the
     * MapMouseListener. The source MouseEvents will only get sent to
     * the MapMouseListener if the mode is set to one that the
     * listener is interested in. Layers interested in receiving
     * events should register for receiving events in "select" mode.
     * <code>
     * <pre>
     * return new String[1] { SelectMouseMode.modeID };
     * </pre>
     * <code>
     * @see NavMouseMode#modeID
     * @see SelectMouseMode#modeID
     * @see NullMouseMode#modeID
     */
    public String[] getMouseModeServiceList() {
        return new String[] { SelectMouseMode.modeID };
    }

    /**
     * Invoked when a mouse button has been pressed on a component.
     *
     * @param e MouseEvent
     * @return true if the listener was able to process the event.
     */
    public boolean mousePressed(MouseEvent e) {
        if (Debug.debugging("TestLayer")) {
            System.out.println("TestLayer.mousePressed()");
        }
        return true;
    }

    /**
     * Invoked when a mouse button has been released on a component.
     *
     * @param e MouseEvent
     * @return true if the listener was able to process the event.
     */
    public boolean mouseReleased(MouseEvent e) {
        if (Debug.debugging("TestLayer")) {
            System.out.println("TestLayer.mouseReleased()");
        }
        return true;
    }

    /**
     * Invoked when the mouse has been clicked on a component. The
     * listener will receive this event if it successfully processed
     * <code>mousePressed()</code>, or if no other listener
     * processes the event. If the listener successfully processes
     * mouseClicked(), then it will receive the next mouseClicked()
     * notifications that have a click count greater than one.
     *
     * @param e MouseListener MouseEvent to handle.
     * @return true if the listener was able to process the event.
     */
    public boolean mouseClicked(MouseEvent e) {
        if (Debug.debugging("TestLayer")) {
            System.out.println("TestLayer.mouseClicked()");
        }
        return true;
    }

    /**
     * Invoked when the mouse enters a component.
     *
     * @param e MouseListener MouseEvent to handle.
     */
    public void mouseEntered(MouseEvent e) {
        if (Debug.debugging("TestLayer")) {
            System.out.println("TestLayer.mouseEntered()");
        }
    }

    /**
     * Invoked when the mouse exits a component.
     *
     * @param e MouseListener MouseEvent to handle.
     */
    public void mouseExited(MouseEvent e) {
        if (Debug.debugging("TestLayer")) {
            System.out.println("TestLayer.mouseExited()");
        }
    }

    // Mouse Motion Listener events
    ///////////////////////////////

    /**
     * Invoked when a mouse button is pressed on a component and then
     * dragged. The listener will receive these events if it
     * successfully processes mousePressed(), or if no other listener
     * processes the event.
     *
     * @param e MouseMotionListener MouseEvent to handle.
     * @return true if the listener was able to process the event.
     */
    public boolean mouseDragged(MouseEvent e) {
        if (Debug.debugging("TestLayer")) {
            System.out.println("TestLayer.mouseDragged()");
        }
        return true;
    }

    /**
     * Invoked when the mouse button has been moved on a component
     * (with no buttons no down).
     *
     * @param e MouseListener MouseEvent to handle.
     * @return true if the listener was able to process the event.
     */
    public boolean mouseMoved(MouseEvent e) {
        if (Debug.debugging("TestLayer")) {
            System.out.println("TestLayer.mouseMoved()");
        }
        return true;
    }

    /**
     * Handle a mouse cursor moving without the button being pressed.
     * This event is intended to tell the listener that there was a
     * mouse movement, but that the event was consumed by another
     * layer. This will allow a mouse listener to clean up actions
     * that might have happened because of another motion event
     * response.
     */
    public void mouseMoved() {
        if (Debug.debugging("TestLayer")) {
            System.out.println("TestLayer.mouseMoved()[alt]");
        }
    }

    //////////////////////////////////////////////////////////////////

    /*
     * The GUI code is implemented here.
     */
    protected abstract class GraphicBase {
        // ll data
        protected float[] llpts = new float[4];
        protected float radius = 4000f;
        protected int type = OMGraphic.LINETYPE_GREATCIRCLE;
        protected int nsegs = 360;

        // xy data
        protected int[] xypts = new int[4];
        protected int width, height;

        // generic
        protected int lineColor = NCOLORS - 2;
        protected int fillColor = NCOLORS - 1;
        protected boolean visible = true;
        protected boolean isFilled = false;
        protected int rt = OMGraphic.RENDERTYPE_LATLON;

        // GUI code
        protected abstract JPanel getGUI();

        protected void setXYCoordinate(JTextField jtf, int i) {
            try {
                xypts[i] = Integer.parseInt(jtf.getText().trim());
            } catch (NumberFormatException ex) {
                return;
            }
        }

        protected void setLLCoordinate(JTextField jtf, int i) {
            try {
                llpts[i] = Float.valueOf(jtf.getText().trim()).floatValue();
            } catch (NumberFormatException ex) {
                return;
            }
        }

        protected void setType(JComboBox jcb) {
            type = jcb.getSelectedIndex() + 1;
            setList(generateGraphics());
            repaint();
        }

        protected void setRender(JComboBox jcb) {
            rt = jcb.getSelectedIndex() + 1;
            setList(generateGraphics());
            repaint();
        }

        protected void setSegs(JTextField jtf) {
            try {
                nsegs = Integer.parseInt(jtf.getText().trim());
            } catch (NumberFormatException ex) {
                return;
            }
        }

        protected void makeFillCheckBox(JComponent parent) {
            JPanel pal = PaletteHelper.createCheckbox(null,
                    new String[] { "Filled" },
                    new boolean[] { isFilled },
                    new ActionListener() {
                        public void actionPerformed(ActionEvent e) {
                            isFilled = !isFilled;
                            setList(generateGraphics());
                            repaint();
                        }
                    });
            parent.add(pal);
        }

        protected void makeColorBox(JComponent parent, String title,
                                    final boolean isFill) {
            JPanel pal = PaletteHelper.createVerticalPanel(title);
            final JComboBox jcb = new JComboBox();
            for (int i = 0; i < NCOLORS; i++) {
                jcb.addItem(colorNames[i]);
            }
            jcb.setSelectedIndex(isFill ? fillColor : lineColor);
            jcb.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    if (isFill)
                        fillColor = jcb.getSelectedIndex();
                    else
                        lineColor = jcb.getSelectedIndex();
                    setList(generateGraphics());
                    repaint();
                }
            });
            pal.add(jcb);
            parent.add(pal);
        }

        // get an OK button which refreshes the display.
        protected JButton getOKButton() {
            // add reset button
            JButton jb = new JButton("OK");
            jb.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    setList(generateGraphics());
                    repaint();
                }
            });
            return jb;
        }
    }

    protected class Line extends GraphicBase {

        protected int arrowtype = -1;
        protected boolean arrowhead = false;

        public Line() {
            llpts[0] = 45f;
            llpts[1] = -90f;
            llpts[2] = 0f;
            llpts[3] = -180f;
            xypts[0] = 45;
            xypts[1] = 90;
            xypts[2] = 0;
            xypts[3] = 180;
            lineColor = 5;
        }

        // makes arrow head selection
        protected void makeArrowHeadGUI(JComponent parent) {
            JPanel pal;
            pal = PaletteHelper.createVerticalPanel(null);
            final JComboBox jcb = new JComboBox();
            jcb.addItem("None");
            jcb.addItem("Arrow Forward");
            jcb.addItem("Arrow Back");
            jcb.addItem("Arrow Both");
            jcb.setSelectedIndex(arrowtype + 1);
            jcb.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    switch (jcb.getSelectedIndex()) {
                    case 0:
                        System.out.println("TestLayer: no arrows");
                        omline.addArrowHead(false);
                        arrowhead = false;
                        arrowtype = -1;
                        break;
                    case 1:
                        System.out.println("TestLayer: arrows forward");
                        arrowhead = true;
                        arrowtype = OMArrowHead.ARROWHEAD_DIRECTION_FORWARD;
                        break;
                    case 2:
                        System.out.println("TestLayer: arrows backward");
                        arrowhead = true;
                        arrowtype = OMArrowHead.ARROWHEAD_DIRECTION_BACKWARD;
                        break;
                    case 3:
                        System.out.println("TestLayer: arrows both");
                        arrowhead = true;
                        arrowtype = OMArrowHead.ARROWHEAD_DIRECTION_BOTH;
                        break;
                    }
                    setList(generateGraphics());
                    repaint();
                }
            });
            pal.add(jcb);
            parent.add(pal);
        }

        public JPanel getGUI() {
            // request focus
            requestFocus();

            JTextField tf;
            JPanel pal;
            final JPanel pop;
            pop = PaletteHelper.createVerticalPanel(null);

            // add arrowheads
            if (!(this instanceof Rect))
                makeArrowHeadGUI(pop);

            if (rt == OMGraphic.RENDERTYPE_LATLON) {
                pal = PaletteHelper.createVerticalPanel(null);
                JComboBox jcb = new JComboBox();
                jcb.addItem("Straight");// indices correspond to
                                        // LineType.java
                jcb.addItem("Rhumb");
                jcb.addItem("Great Circle");
                jcb.setSelectedIndex(type - 1);
                jcb.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent e) {
                        setType((JComboBox) e.getSource());
                    }
                });
                pal.add(jcb);
                pop.add(pal);
                tf = PaletteHelper.createTextEntry("nsegs", "" + nsegs, pop);
                tf.addFocusListener(new FocusAdapter() {
                    public void focusLost(FocusEvent e) {
                        setSegs((JTextField) e.getSource());
                    }
                });
            }
            if (rt != OMGraphic.RENDERTYPE_XY) {
                tf = PaletteHelper.createTextEntry("lat1", "" + llpts[0], pop);
                tf.addFocusListener(new FocusAdapter() {
                    public void focusLost(FocusEvent e) {
                        setLLCoordinate((JTextField) e.getSource(), 0);
                    }
                });
                tf = PaletteHelper.createTextEntry("lon1", "" + llpts[1], pop);
                tf.addFocusListener(new FocusAdapter() {
                    public void focusLost(FocusEvent e) {
                        setLLCoordinate((JTextField) e.getSource(), 1);
                    }
                });
            }

            if (rt == OMGraphic.RENDERTYPE_LATLON) {
                tf = PaletteHelper.createTextEntry("lat2", "" + llpts[2], pop);
                tf.addFocusListener(new FocusAdapter() {
                    public void focusLost(FocusEvent e) {
                        setLLCoordinate((JTextField) e.getSource(), 2);
                    }
                });
                tf = PaletteHelper.createTextEntry("lon2", "" + llpts[3], pop);
                tf.addFocusListener(new FocusAdapter() {
                    public void focusLost(FocusEvent e) {
                        setLLCoordinate((JTextField) e.getSource(), 3);
                    }
                });
            } else {
                tf = PaletteHelper.createTextEntry("x1", "" + xypts[0], pop);
                tf.addFocusListener(new FocusAdapter() {
                    public void focusLost(FocusEvent e) {
                        setXYCoordinate((JTextField) e.getSource(), 0);
                    }
                });
                tf = PaletteHelper.createTextEntry("y1", "" + xypts[1], pop);
                tf.addFocusListener(new FocusAdapter() {
                    public void focusLost(FocusEvent e) {
                        setXYCoordinate((JTextField) e.getSource(), 1);
                    }
                });
                tf = PaletteHelper.createTextEntry("x2", "" + xypts[2], pop);
                tf.addFocusListener(new FocusAdapter() {
                    public void focusLost(FocusEvent e) {
                        setXYCoordinate((JTextField) e.getSource(), 2);
                    }
                });
                tf = PaletteHelper.createTextEntry("y2", "" + xypts[3], pop);
                tf.addFocusListener(new FocusAdapter() {
                    public void focusLost(FocusEvent e) {
                        setXYCoordinate((JTextField) e.getSource(), 3);
                    }
                });
            }

            // line color
            makeColorBox(pop, "line", false);

            // fill color
            if (this instanceof Rect)
                makeColorBox(pop, "fill", true);

            // filled?
            if (this instanceof Rect)
                makeFillCheckBox(pop);

            // add ok button
            pop.add(getOKButton());

            return pop;
        }
    }

    protected class Rect extends Line {
        public Rect() {
            llpts[0] = -80f;
            llpts[1] = 0f;
            llpts[2] = 10f;
            llpts[3] = 45f;
            xypts[0] = 250;
            xypts[1] = 100;
            xypts[2] = 150;
            xypts[3] = 380;
            lineColor = 0;
            fillColor = 9;
            type = OMGraphic.LINETYPE_RHUMB;
        }
    }

    protected class Circle extends GraphicBase {

        public Circle() {
            xypts[0] = 10;
            xypts[1] = 20;
            width = 10;
            height = 20;
            fillColor = 0;
        }

        public JPanel getGUI() {
            // request focus
            requestFocus();

            final JPanel pop;
            JTextField tf;
            pop = PaletteHelper.createVerticalPanel(null);

            if (rt != OMGraphic.RENDERTYPE_XY) {
                tf = PaletteHelper.createTextEntry("lat", "" + llpts[0], pop);
                tf.addFocusListener(new FocusAdapter() {
                    public void focusLost(FocusEvent e) {
                        setLLCoordinate((JTextField) e.getSource(), 0);
                    }
                });
                tf = PaletteHelper.createTextEntry("lon", "" + llpts[1], pop);
                tf.addFocusListener(new FocusAdapter() {
                    public void focusLost(FocusEvent e) {
                        setLLCoordinate((JTextField) e.getSource(), 1);
                    }
                });
            } else {
                tf = PaletteHelper.createTextEntry("x", "" + xypts[0], pop);
                tf.addFocusListener(new FocusAdapter() {
                    public void focusLost(FocusEvent e) {
                        setXYCoordinate((JTextField) e.getSource(), 0);
                    }
                });
                tf = PaletteHelper.createTextEntry("y", "" + xypts[1], pop);
                tf.addFocusListener(new FocusAdapter() {
                    public void focusLost(FocusEvent e) {
                        setXYCoordinate((JTextField) e.getSource(), 1);
                    }
                });
            }

            if (rt == OMGraphic.RENDERTYPE_OFFSET) {
                tf = PaletteHelper.createTextEntry("off_x", "" + xypts[0], pop);
                tf.addFocusListener(new FocusAdapter() {
                    public void focusLost(FocusEvent e) {
                        setXYCoordinate((JTextField) e.getSource(), 0);
                    }
                });
                tf = PaletteHelper.createTextEntry("off_y", "" + xypts[1], pop);
                tf.addFocusListener(new FocusAdapter() {
                    public void focusLost(FocusEvent e) {
                        setXYCoordinate((JTextField) e.getSource(), 1);
                    }
                });
            } else if (rt == OMGraphic.RENDERTYPE_LATLON) {
                tf = PaletteHelper.createTextEntry("R (km)", "" + radius, pop);
                tf.addFocusListener(new FocusAdapter() {
                    public void focusLost(FocusEvent e) {
                        JTextField jtf = (JTextField) e.getSource();
                        float f = radius;
                        try {
                            f = Float.valueOf(jtf.getText().trim())
                                    .floatValue();
                        } catch (NumberFormatException ex) {
                            return;
                        }
                        radius = f;
                        System.out.println("TestLayer: radius=" + radius);
                    }
                });
                tf = PaletteHelper.createTextEntry("nverts", "" + nsegs, pop);
                tf.addFocusListener(new FocusAdapter() {
                    public void focusLost(FocusEvent e) {
                        setSegs((JTextField) e.getSource());
                    }
                });
            }

            if (rt != OMGraphic.RENDERTYPE_LATLON) {
                tf = PaletteHelper.createTextEntry("width", "" + width, pop);
                tf.addFocusListener(new FocusAdapter() {
                    public void focusLost(FocusEvent e) {
                        JTextField jtf = (JTextField) e.getSource();
                        try {
                            width = Integer.parseInt(jtf.getText().trim());
                        } catch (NumberFormatException ex) {
                            return;
                        }
                    }
                });
                tf = PaletteHelper.createTextEntry("height", "" + height, pop);
                tf.addFocusListener(new FocusAdapter() {
                    public void focusLost(FocusEvent e) {
                        JTextField jtf = (JTextField) e.getSource();
                        try {
                            height = Integer.parseInt(jtf.getText().trim());
                        } catch (NumberFormatException ex) {
                            return;
                        }
                    }
                });
            }

            // line color
            makeColorBox(pop, "line", false);

            // fill color
            makeColorBox(pop, "fill", true);

            // filled?
            makeFillCheckBox(pop);

            // add ok button
            pop.add(getOKButton());

            return pop;
        }
    }

    protected class Poly extends GraphicBase {

        protected float lat = 0f;
        protected float lon = 0f;
        protected int cMode = OMPoly.COORDMODE_ORIGIN;

        public Poly() {
            llpts = new float[8];
            xypts = new int[6];
            llpts[0] = 10f;
            llpts[1] = -20f;
            llpts[2] = 45f;
            llpts[3] = -70f;
            llpts[4] = 0f;
            llpts[5] = -90f;
            llpts[6] = -15f;
            llpts[7] = -40f;
            xypts[0] = 145;
            xypts[1] = 190;
            xypts[2] = 160;
            xypts[3] = 210;
            xypts[2] = 135;
            xypts[3] = 215;
            lineColor = 4;
            fillColor = 9;
            type = OMGraphic.LINETYPE_GREATCIRCLE;
        }

        // set latlon vertices
        protected void setVertices(String verts) {
            try {
                String str;
                StringTokenizer tok = new StringTokenizer(verts, "\n\r");

                // clean out comments
                verts = "";
                while (tok.hasMoreTokens()) {
                    str = tok.nextToken().trim();
                    if (str.charAt(0) != '#') {
                        verts = verts + str + " ";
                    }
                }

                // extract vertices
                tok = new StringTokenizer(verts);
                int size = tok.countTokens();
                System.out.println("ll size=" + size);
                llpts = new float[size];
                for (int i = 0; i < size; i += 2) {
                    str = tok.nextToken();
                    System.out.print("lat=" + str);
                    llpts[i] = Float.valueOf(str).floatValue();
                    str = tok.nextToken();
                    System.out.println(" lon=" + str);
                    llpts[i + 1] = Float.valueOf(str).floatValue();
                }
            } catch (NumberFormatException ex) {
                return;
            }
        }

        protected void setXY(JTextArea jta) {
            try {
                if (false)
                    throw new NumberFormatException("foo");
            } catch (NumberFormatException ex) {
                return;
            }
        }

        protected void setLL(JTextArea jta) {
            setVertices(jta.getText().trim());
        }

        protected void setLLCoordinate(JTextField jtf, int i) {
            try {
                if (i == 0)
                    lat = Float.valueOf(jtf.getText().trim()).floatValue();
                else
                    lon = Float.valueOf(jtf.getText().trim()).floatValue();
            } catch (NumberFormatException ex) {
                return;
            }
        }

        public JPanel getGUI() {
            // request focus
            requestFocus();

            final JPanel pop;
            JPanel pal;
            JTextField tf;
            JTextArea ta;
            pop = PaletteHelper.createVerticalPanel(null);

            if (rt == OMGraphic.RENDERTYPE_LATLON) {
                pal = PaletteHelper.createVerticalPanel(null);
                JComboBox jcb = new JComboBox();
                jcb.addItem("Straight");// indices correspond to
                                        // LineType.java
                jcb.addItem("Rhumb");
                jcb.addItem("Great Circle");
                jcb.setSelectedIndex(type - 1);
                jcb.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent e) {
                        setType((JComboBox) e.getSource());
                    }
                });
                pal.add(jcb);
                pop.add(pal);
                tf = PaletteHelper.createTextEntry("nsegs", "" + nsegs, pop);
                tf.addFocusListener(new FocusAdapter() {
                    public void focusLost(FocusEvent e) {
                        setSegs((JTextField) e.getSource());
                    }
                });
                String entry = "";
                for (int i = 0; i < llpts.length; i += 2) {
                    entry = entry + llpts[i] + " " + llpts[i + 1] + "\n";
                }
                ta = PaletteHelper.createTextArea("llpts", entry, pop, 5, 8);
                ta.addFocusListener(new FocusAdapter() {
                    public void focusLost(FocusEvent e) {
                        setLL((JTextArea) e.getSource());
                    }
                });
            } else {
                if (rt == OMGraphic.RENDERTYPE_OFFSET) {
                    tf = PaletteHelper.createTextEntry("lat",
                            "" + llpts[0],
                            pop);
                    tf.addFocusListener(new FocusAdapter() {
                        public void focusLost(FocusEvent e) {
                            setLLCoordinate((JTextField) e.getSource(), 0);
                        }
                    });
                    tf = PaletteHelper.createTextEntry("lon",
                            "" + llpts[1],
                            pop);
                    tf.addFocusListener(new FocusAdapter() {
                        public void focusLost(FocusEvent e) {
                            setLLCoordinate((JTextField) e.getSource(), 1);
                        }
                    });
                }
                String entry = "";
                for (int i = 0; i < xypts.length; i += 2) {
                    entry = entry + xypts[i] + " " + xypts[i + 1] + "\n";
                }
                ta = PaletteHelper.createTextArea("xypts", entry, pop, 0, 0);
                ta.addFocusListener(new FocusAdapter() {
                    public void focusLost(FocusEvent e) {
                        setXY((JTextArea) e.getSource());
                    }
                });
            }

            // line color
            makeColorBox(pop, "line", false);

            // fill color
            makeColorBox(pop, "fill", true);

            // filled?
            makeFillCheckBox(pop);

            // add ok button
            pop.add(getOKButton());

            return pop;
        }
    }

    protected class Text extends GraphicBase {
        protected String data;
        protected String font = "SansSerif-Bold-18";
        protected int just = OMText.JUSTIFY_CENTER;

        public Text() {
            llpts[0] = 42.35f;
            llpts[1] = -70.5f;
            xypts[0] = 20;
            xypts[1] = 10;
            lineColor = 10;
            data = "Boston";
        }

        public JPanel getGUI() {
            // request focus
            requestFocus();

            final JPanel pop;
            JPanel pal;
            JTextField tf;
            final JComboBox jcb;
            pop = PaletteHelper.createVerticalPanel(null);

            tf = PaletteHelper.createTextEntry("text", data, pop);
            tf.addFocusListener(new FocusAdapter() {
                public void focusLost(FocusEvent e) {
                    data = ((JTextField) (e.getSource())).getText().trim();
                }
            });

            tf = PaletteHelper.createTextEntry("font", font, pop);
            tf.addFocusListener(new FocusAdapter() {
                public void focusLost(FocusEvent e) {
                    font = ((JTextField) (e.getSource())).getText().trim();
                }
            });

            pal = PaletteHelper.createVerticalPanel(null);
            jcb = new JComboBox();
            jcb.addItem("right");// indices correspond to values in
                                 // OMText
            jcb.addItem("center");
            jcb.addItem("left");
            jcb.setSelectedIndex(just);
            jcb.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    just = jcb.getSelectedIndex();
                    setList(generateGraphics());
                    repaint();
                }
            });
            pal.add(jcb);
            pop.add(pal);

            if (rt != OMGraphic.RENDERTYPE_XY) {
                tf = PaletteHelper.createTextEntry("lat", "" + llpts[0], pop);
                tf.addFocusListener(new FocusAdapter() {
                    public void focusLost(FocusEvent e) {
                        setLLCoordinate((JTextField) e.getSource(), 0);
                    }
                });
                tf = PaletteHelper.createTextEntry("lon", "" + llpts[1], pop);
                tf.addFocusListener(new FocusAdapter() {
                    public void focusLost(FocusEvent e) {
                        setLLCoordinate((JTextField) e.getSource(), 1);
                    }
                });
            }

            if (rt != OMGraphic.RENDERTYPE_LATLON) {
                tf = PaletteHelper.createTextEntry("off_x", "" + xypts[0], pop);
                tf.addFocusListener(new FocusAdapter() {
                    public void focusLost(FocusEvent e) {
                        setXYCoordinate((JTextField) e.getSource(), 0);
                    }
                });
                tf = PaletteHelper.createTextEntry("off_y", "" + xypts[1], pop);
                tf.addFocusListener(new FocusAdapter() {
                    public void focusLost(FocusEvent e) {
                        setXYCoordinate((JTextField) e.getSource(), 1);
                    }
                });
            }

            // line color
            makeColorBox(pop, "text", false);

            // add ok button
            pop.add(getOKButton());

            return pop;
        }
    }
}
TOP

Related Classes of com.bbn.openmap.layer.test.TestLayer$GraphicBase

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.