/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * PlotWindow.java
 *
 * Created on Jul 8, 2009, 2:14:10 PM
 */

package us.menzies.plot;

/**
 *
 * @author zmurray
 */
public class PlotWindow extends javax.swing.JFrame {

    /** Creates new form PlotWindow */
    public PlotWindow() {
        initComponents();
        startup3D();
    }

    public javax.media.j3d.Canvas3D getCanvas3D() {
        return canvas;
    }

    public javax.media.j3d.BranchGroup getGraphRoot() {
        return graphRoot;
    }

    public javax.media.j3d.TransformGroup getTransformGroup() {
        return transformGroup;
    }

    public javax.swing.JComboBox getModelSelector() {
        return modelSelector;
    }

    public void addModelSelectorActionListener(java.awt.event.ActionListener l) {
        modelSelector.addActionListener(l);
    }

    public java.lang.String getSelectedModel() {
        java.lang.Object selectedItem = modelSelector.getSelectedItem();
        if(selectedItem instanceof java.lang.String) {
            return (String)selectedItem;
        }
        throw new java.lang.RuntimeException("selected item is not a String");
    }

    public int getSelectedModelID() {
        java.lang.String model = getSelectedModel();
        int ret = NO_MODEL_SELECTED;
        if(model.equals("Model - Evett")) {
            ret = MODEL_EVETT;
        } else if(model.equals("Model - Grove")) {
            ret = MODEL_GROVE;
        } else if(model.equals("Model - Seheult")) {
            ret = MODEL_SEHEULT;
        } else if(model.equals("Model - Walsh")) {
            ret = MODEL_WALSH;
        }
        return ret;
    }

    public void addPlotButtonActionListener(java.awt.event.ActionListener l) {
        plotButton.addActionListener(l);
    }

    public int getSamples() {
        return sampleSlider.getValue();
    }

    public boolean isFastmapSelected() {
        return fastmapCheckBox.isSelected();
    }

    public int getEvettLambda() {
        return evettLambdaSlider.getValue();
    }

    public double getEvettFValues() {
        return ((double)evettFValuesSlider.getValue())*0.0024+0.01;
    }

    public int getEvettN() {
        return evettNSlider.getValue();
    }

    public void init3D() {
        if(colorWhite == null) {
            colorWhite = new javax.vecmath.Color3f(1.0f, 1.0f, 1.0f);
        }
        if(colorBlack == null) {
            colorBlack = new javax.vecmath.Color3f(0.0f, 0.0f, 0.0f);
        }
        if(axisMaterial == null) {
            axisMaterial = new javax.media.j3d.Material();
            axisMaterial.setAmbientColor(new javax.vecmath.Color3f(0.8f, 0.8f, 0.8f));
            axisMaterial.setDiffuseColor(new javax.vecmath.Color3f(0.9f, 0.9f, 0.9f));
            axisMaterial.setSpecularColor(new javax.vecmath.Color3f(1.0f, 1.0f, 1.0f));
            axisMaterial.setEmissiveColor(new javax.vecmath.Color3f(0.1f, 0.1f, 0.1f));
        }
        if(axisAppearance == null) {
            axisAppearance = new javax.media.j3d.Appearance();
            axisAppearance.setMaterial(axisMaterial);
        }
    }

    public synchronized void redrawPlot() {
        transformGroup = createPlotTransformGroup();
        hingeBranch = createHingeBranch(transformGroup);
        graphRoot.addChild(hingeBranch);
    }

    public synchronized void startup3D() {
        init3D();
        baseTransformGroup = createBaseTransformGroup();
        graphRoot = createGraphRoot(baseTransformGroup);
        redrawPlot();
        universe = createUniverse();
    }
    
    public void erasePlot() {
        graphRoot.removeChild(hingeBranch);
        redrawPlot();
    }

    protected javax.media.j3d.BranchGroup createReversibleLabel(javax.media.j3d.Node obj, float x, float y, float z, float x2) {
        javax.media.j3d.Node clone = obj.cloneTree();
        javax.media.j3d.BranchGroup branch = new javax.media.j3d.BranchGroup();
        javax.media.j3d.TransformGroup front = new javax.media.j3d.TransformGroup();
        javax.media.j3d.Transform3D fronttrans = new javax.media.j3d.Transform3D();
        fronttrans.setTranslation(new javax.vecmath.Vector3f(x, y, z));
        front.setTransform(fronttrans);
        front.addChild(obj);
        branch.addChild(front);
        javax.media.j3d.TransformGroup back = new javax.media.j3d.TransformGroup();
        javax.media.j3d.Transform3D backtrans = new javax.media.j3d.Transform3D();
        backtrans.rotY(java.lang.Math.PI);
        backtrans.setTranslation(new javax.vecmath.Vector3f(x2, y, z));
        back.setTransform(backtrans);
        back.addChild(clone);
        branch.addChild(back);
        branch.compile();
        return branch;
    }

    protected javax.media.j3d.BranchGroup createReversibleLabel(javax.media.j3d.Node obj, float x, float y, float z) {
        return createReversibleLabel(obj, x, y, z, -1.0f*x);
    }

    protected javax.media.j3d.BranchGroup createAxisLabels(javax.vecmath.Color3f fontColor, java.lang.String fontFace, int fontSize) {
        com.sun.j3d.utils.geometry.Text2D xtext = new com.sun.j3d.utils.geometry.Text2D("x", fontColor, fontFace, fontSize, 1);
        com.sun.j3d.utils.geometry.Text2D ytext = new com.sun.j3d.utils.geometry.Text2D("y", fontColor, fontFace, fontSize, 1);
        com.sun.j3d.utils.geometry.Text2D ztext = new com.sun.j3d.utils.geometry.Text2D("z", fontColor, fontFace, fontSize, 1);
        javax.media.j3d.BranchGroup branch = new javax.media.j3d.BranchGroup();
        branch.addChild(createReversibleLabel(xtext, 0.952f, 0.0f, 0.0f, 1.0f));
        branch.addChild(createReversibleLabel(ytext, -0.02f, 1.01f, 0.0f));
        branch.addChild(createReversibleLabel(ztext, -0.02f, 0.0f, 0.99f));
        branch.compile();
        return branch;
    }

    protected javax.media.j3d.BranchGroup createAxisLabels() {
        init3D();
        return createAxisLabels(colorWhite, "Verdana", 18);
    }

    protected javax.media.j3d.TransformGroup createBaseTransformGroup() {
        init3D();
        javax.media.j3d.TransformGroup objTrans = new javax.media.j3d.TransformGroup();
        com.sun.j3d.utils.geometry.Box xaxis = new com.sun.j3d.utils.geometry.Box(1.0f, 0.005f, 0.005f, axisAppearance);
        com.sun.j3d.utils.geometry.Box yaxis = new com.sun.j3d.utils.geometry.Box(0.005f, 1.0f, 0.005f, axisAppearance);
        com.sun.j3d.utils.geometry.Box zaxis = new com.sun.j3d.utils.geometry.Box(0.005f, 0.005f, 1.0f, axisAppearance);
        objTrans.addChild(xaxis);
        objTrans.addChild(yaxis);
        objTrans.addChild(zaxis);
        objTrans.addChild(createAxisLabels());
        return objTrans;
    }

    protected javax.media.j3d.Light createStandardLight(javax.vecmath.Color3f c, javax.vecmath.Vector3f v, javax.media.j3d.Bounds b) {
        javax.media.j3d.Light light = new javax.media.j3d.DirectionalLight(c, v);
        light.setInfluencingBounds(b);
        return light;
    }

    protected javax.media.j3d.BranchGroup createGraphRoot(javax.media.j3d.TransformGroup objTrans) {
        javax.vecmath.Color3f frontlightcolor = new javax.vecmath.Color3f(0.75f, 0.75f, 0.75f);
        javax.vecmath.Color3f sidelightcolor = new javax.vecmath.Color3f(0.4f, 0.4f, 0.4f);
        javax.media.j3d.Bounds bounds = new javax.media.j3d.BoundingSphere(new javax.vecmath.Point3d(0.0, 0.0, 4.0), 6.0);
        javax.media.j3d.BranchGroup branch = new javax.media.j3d.BranchGroup();
        branch.setCapability(javax.media.j3d.BranchGroup.ALLOW_CHILDREN_EXTEND);
        branch.setCapability(javax.media.j3d.BranchGroup.ALLOW_DETACH);
        branch.setCapability(javax.media.j3d.BranchGroup.ALLOW_CHILDREN_WRITE);
        branch.addChild(createStandardLight(frontlightcolor, new javax.vecmath.Vector3f(0.0f, 0.0f, -1.0f), bounds));
        branch.addChild(createStandardLight(frontlightcolor, new javax.vecmath.Vector3f(0.0f, 0.0f, 1.0f), bounds));
        branch.addChild(createStandardLight(sidelightcolor, new javax.vecmath.Vector3f(-1.0f, 0.0f, 0.0f), bounds));
        branch.addChild(createStandardLight(sidelightcolor, new javax.vecmath.Vector3f(1.0f, 0.0f, 0.0f), bounds));
        branch.addChild(createStandardLight(sidelightcolor, new javax.vecmath.Vector3f(0.0f, -1.0f, 0.0f), bounds));
        branch.addChild(createStandardLight(sidelightcolor, new javax.vecmath.Vector3f(0.0f, 1.0f, 0.0f), bounds));
        branch.addChild(objTrans);
        branch.compile();
        return branch;
    }

    protected javax.media.j3d.BranchGroup createGraphRoot() {
        return createGraphRoot(getTransformGroup());
    }

    protected javax.media.j3d.TransformGroup createPlotTransformGroup() {
        init3D();
        javax.media.j3d.TransformGroup trans = new javax.media.j3d.TransformGroup();
        trans.setCapability(javax.media.j3d.TransformGroup.ALLOW_CHILDREN_EXTEND);
        return trans;
    }

    protected javax.media.j3d.BranchGroup createHingeBranch(javax.media.j3d.TransformGroup trans) {
        javax.media.j3d.BranchGroup branch = new javax.media.j3d.BranchGroup();
        branch.setCapability(javax.media.j3d.BranchGroup.ALLOW_CHILDREN_EXTEND);
        branch.setCapability(javax.media.j3d.BranchGroup.ALLOW_DETACH);
        branch.addChild(trans);
        return branch;
    }

    protected com.sun.j3d.utils.universe.SimpleUniverse createUniverse() {
        com.sun.j3d.utils.universe.SimpleUniverse tempUniverse = new com.sun.j3d.utils.universe.SimpleUniverse(canvas);
        com.sun.j3d.utils.universe.ViewingPlatform viewingPlatform = tempUniverse.getViewingPlatform();
        javax.media.j3d.TransformGroup viewingTransform = viewingPlatform.getViewPlatformTransform();
        com.sun.j3d.utils.behaviors.vp.OrbitBehavior orbit = new com.sun.j3d.utils.behaviors.vp.OrbitBehavior(canvas);
        orbit.setMinRadius(0.2);
        orbit.setRotationCenter(new javax.vecmath.Point3d(0.5, 0.5, 0.5));
        orbit.setSchedulingBounds(new javax.media.j3d.BoundingSphere(new javax.vecmath.Point3d(0.0, 0.0, 0.0), 8.0));
        javax.media.j3d.Transform3D trans = new javax.media.j3d.Transform3D();
        viewingPlatform.setViewPlatformBehavior(orbit);
        viewingPlatform.setNominalViewingTransform();
        tempUniverse.addBranchGraph(getGraphRoot());
        return tempUniverse;
    }

    public javax.media.j3d.Node createPoint(float r, float g, float b, float radius) {
        com.sun.j3d.utils.geometry.Sphere point = new com.sun.j3d.utils.geometry.Sphere(radius);
        javax.media.j3d.Appearance appearance = new javax.media.j3d.Appearance();
        javax.media.j3d.Material material = new javax.media.j3d.Material();
        int shademodel = javax.media.j3d.ColoringAttributes.SHADE_GOURAUD;
        javax.media.j3d.ColoringAttributes coloring = new javax.media.j3d.ColoringAttributes(r, g, b, shademodel);
        material.setAmbientColor(colorBlack);
        material.setDiffuseColor(new javax.vecmath.Color3f(r, g, b));
        material.setSpecularColor(colorWhite);
        material.setEmissiveColor(new javax.vecmath.Color3f(r/2, g/2, b/2));
        appearance.setMaterial(material);
        appearance.setColoringAttributes(coloring);
        point.setAppearance(appearance);
        return (javax.media.j3d.Node)point;
    }

    public javax.media.j3d.Node createPoint(float r, float g, float b) {
        return createPoint(r, g, b, pointDefaultSize);
    }

    public javax.media.j3d.Node createPoint() {
        return createPoint(0.9f, 0.9f, 0.9f);
    }

    public void plot(double x, double y, double z, javax.media.j3d.Node referenceObject) {
        javax.vecmath.Vector3d vector = new javax.vecmath.Vector3d(x, y, z);
        javax.media.j3d.BranchGroup branch = new javax.media.j3d.BranchGroup();
        javax.media.j3d.TransformGroup objTrans = new javax.media.j3d.TransformGroup();
        javax.media.j3d.Transform3D transform = new javax.media.j3d.Transform3D();
        transform.setTranslation(vector);
        objTrans.setTransform(transform);
        objTrans.addChild(referenceObject.cloneTree());
        branch.addChild(objTrans);
        branch.compile();
        synchronized(transformGroupIntrinsicLock) {
            transformGroup.addChild(branch);
        }
    }

    public void plot(double x, double y, double z) {
        plot(x, y, z, createPoint());
    }

    protected void makeAllConfigPanelsInvisible() {
        evettConfigPanel.setVisible(false);
        groveConfigPanel.setVisible(false);
        seheultConfigPanel.setVisible(false);
        walshConfigPanel.setVisible(false);
        defaultConfigPanel.setVisible(false);
    }

    protected void putConfigPanelsDown() {
        configLayeredPane.setLayer(evettConfigPanel, javax.swing.JLayeredPane.DEFAULT_LAYER);
        configLayeredPane.setLayer(groveConfigPanel, javax.swing.JLayeredPane.DEFAULT_LAYER);
        configLayeredPane.setLayer(seheultConfigPanel, javax.swing.JLayeredPane.DEFAULT_LAYER);
        configLayeredPane.setLayer(walshConfigPanel, javax.swing.JLayeredPane.DEFAULT_LAYER);
        configLayeredPane.setLayer(defaultConfigPanel, javax.swing.JLayeredPane.DEFAULT_LAYER);
    }

    protected void switchToConfigPanel(javax.swing.JPanel configPanel) {
        makeAllConfigPanelsInvisible();
        putConfigPanelsDown();
        configLayeredPane.setLayer(configPanel, javax.swing.JLayeredPane.PALETTE_LAYER);
        configPanel.setVisible(true);
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {
        bindingGroup = new org.jdesktop.beansbinding.BindingGroup();

        jLabel1 = new javax.swing.JLabel();
        jTextField1 = new javax.swing.JTextField();
        sidebarPanel = new javax.swing.JPanel();
        tabbedPane = new javax.swing.JTabbedPane();
        importTabPanel = new javax.swing.JPanel();
        randomTabPanel = new javax.swing.JPanel();
        modelSelectorPanel = new javax.swing.JPanel();
        modelSelector = new javax.swing.JComboBox();
        sampleConfigurationPanel = new javax.swing.JPanel();
        sampleSlider = new javax.swing.JSlider();
        nSamplesLabel = new javax.swing.JLabel();
        nSamplesField = new javax.swing.JTextField();
        fastmapCheckBox = new javax.swing.JCheckBox();
        bottomSidebarPanel = new javax.swing.JPanel();
        configLayeredPane = new javax.swing.JLayeredPane();
        defaultConfigPanel = new javax.swing.JPanel();
        titleLabel = new javax.swing.JLabel();
        universityLabel = new javax.swing.JLabel();
        milImageLabel = new javax.swing.JLabel();
        evettConfigPanel = new javax.swing.JPanel();
        evettLambdaLabel = new javax.swing.JLabel();
        evettLambdaSlider = new javax.swing.JSlider();
        evettLambdaField = new javax.swing.JTextField();
        evettFValuesLabel = new javax.swing.JLabel();
        evettFValuesSlider = new javax.swing.JSlider();
        evettFValuesField = new javax.swing.JTextField();
        evettNLabel = new javax.swing.JLabel();
        evettNSlider = new javax.swing.JSlider();
        evettNField = new javax.swing.JTextField();
        groveConfigPanel = new javax.swing.JPanel();
        groveSlidersPanel = new javax.swing.JPanel();
        groveXPanel = new javax.swing.JPanel();
        groveXSlider = new javax.swing.JSlider();
        groveXLabelPanel = new javax.swing.JPanel();
        groveXLabel = new javax.swing.JLabel();
        groveYPanel = new javax.swing.JPanel();
        groveYSlider = new javax.swing.JSlider();
        groveYLabelPanel = new javax.swing.JPanel();
        groveYLabel = new javax.swing.JLabel();
        groveSDPanel = new javax.swing.JPanel();
        groveSDSlider = new javax.swing.JSlider();
        groveSDLabelPanel = new javax.swing.JPanel();
        groveSDLabel = new javax.swing.JLabel();
        groveMuPanel = new javax.swing.JPanel();
        groveMuSlider = new javax.swing.JSlider();
        groveMuLabelPanel = new javax.swing.JPanel();
        groveMuLabel = new javax.swing.JLabel();
        groveTauPanel = new javax.swing.JPanel();
        groveTauSlider = new javax.swing.JSlider();
        groveTauLabelPanel = new javax.swing.JPanel();
        groveTauLabel = new javax.swing.JLabel();
        groveStatusPane = new javax.swing.JLayeredPane();
        groveStatusPanel = new javax.swing.JPanel();
        groveStatusLabel = new javax.swing.JLabel();
        groveConfigEditorPanel = new javax.swing.JPanel();
        groveEditorPanel = new javax.swing.JPanel();
        groveEditField = new javax.swing.JTextField();
        groveEditLabel = new javax.swing.JLabel();
        seheultConfigPanel = new javax.swing.JPanel();
        walshConfigPanel = new javax.swing.JPanel();
        plotButton = new javax.swing.JButton();
        canvasPanel = new javax.swing.JPanel();
        canvas = new javax.media.j3d.Canvas3D(java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getBestConfiguration(new javax.media.j3d.GraphicsConfigTemplate3D()));
        internalAWTCanvas = (java.awt.Canvas)canvas;

        jLabel1.setText("jLabel1");

        jTextField1.setText("jTextField1");

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("Modelling Intelligence Lab");
        addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
            public void mouseDragged(java.awt.event.MouseEvent evt) {
                formMouseDragged(evt);
            }
        });
        addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseEntered(java.awt.event.MouseEvent evt) {
                formMouseEntered(evt);
            }
        });

        sidebarPanel.setPreferredSize(new java.awt.Dimension(237, 480));
        sidebarPanel.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseEntered(java.awt.event.MouseEvent evt) {
                sidebarPanelMouseEntered(evt);
            }
        });

        tabbedPane.setPreferredSize(new java.awt.Dimension(237, 240));
        tabbedPane.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseEntered(java.awt.event.MouseEvent evt) {
                tabbedPaneMouseEntered(evt);
            }
        });

        importTabPanel.setPreferredSize(new java.awt.Dimension(100, 200));

        org.jdesktop.layout.GroupLayout importTabPanelLayout = new org.jdesktop.layout.GroupLayout(importTabPanel);
        importTabPanel.setLayout(importTabPanelLayout);
        importTabPanelLayout.setHorizontalGroup(
            importTabPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(0, 216, Short.MAX_VALUE)
        );
        importTabPanelLayout.setVerticalGroup(
            importTabPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(0, 204, Short.MAX_VALUE)
        );

        tabbedPane.addTab("Import", null, importTabPanel, "Contains settings for plotting external data.");

        randomTabPanel.setPreferredSize(new java.awt.Dimension(100, 200));

        modelSelector.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Select Tool...", "Model - Evett", "Model - Grove", "Model - Seheult", "Model - Walsh" }));
        modelSelector.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                modelSelectorActionPerformed(evt);
            }
        });

        sampleSlider.setMaximum(6000);
        sampleSlider.setMinimum(100);
        sampleSlider.setMinorTickSpacing(25);
        sampleSlider.setValue(3000);
        sampleSlider.setPreferredSize(new java.awt.Dimension(83, 29));

        nSamplesLabel.setText("# of Samples:");

        nSamplesField.setHorizontalAlignment(javax.swing.JTextField.RIGHT);

        org.jdesktop.beansbinding.Binding binding = org.jdesktop.beansbinding.Bindings.createAutoBinding(org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, sampleSlider, org.jdesktop.beansbinding.ELProperty.create("${value}"), nSamplesField, org.jdesktop.beansbinding.BeanProperty.create("text"));
        bindingGroup.addBinding(binding);

        fastmapCheckBox.setText("Apply Fastmap");

        org.jdesktop.layout.GroupLayout sampleConfigurationPanelLayout = new org.jdesktop.layout.GroupLayout(sampleConfigurationPanel);
        sampleConfigurationPanel.setLayout(sampleConfigurationPanelLayout);
        sampleConfigurationPanelLayout.setHorizontalGroup(
            sampleConfigurationPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(sampleConfigurationPanelLayout.createSequentialGroup()
                .add(8, 8, 8)
                .add(nSamplesLabel)
                .add(2, 2, 2)
                .add(nSamplesField, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 81, Short.MAX_VALUE))
            .add(sampleSlider, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 176, Short.MAX_VALUE)
            .add(sampleConfigurationPanelLayout.createSequentialGroup()
                .add(fastmapCheckBox)
                .addContainerGap())
        );
        sampleConfigurationPanelLayout.setVerticalGroup(
            sampleConfigurationPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(sampleConfigurationPanelLayout.createSequentialGroup()
                .add(sampleSlider, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(sampleConfigurationPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                    .add(nSamplesField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .add(nSamplesLabel))
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(fastmapCheckBox)
                .addContainerGap(54, Short.MAX_VALUE))
        );

        org.jdesktop.layout.GroupLayout modelSelectorPanelLayout = new org.jdesktop.layout.GroupLayout(modelSelectorPanel);
        modelSelectorPanel.setLayout(modelSelectorPanelLayout);
        modelSelectorPanelLayout.setHorizontalGroup(
            modelSelectorPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(modelSelector, 0, 176, Short.MAX_VALUE)
            .add(sampleConfigurationPanel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );
        modelSelectorPanelLayout.setVerticalGroup(
            modelSelectorPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(modelSelectorPanelLayout.createSequentialGroup()
                .add(modelSelector, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .add(sampleConfigurationPanel, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
        );

        org.jdesktop.layout.GroupLayout randomTabPanelLayout = new org.jdesktop.layout.GroupLayout(randomTabPanel);
        randomTabPanel.setLayout(randomTabPanelLayout);
        randomTabPanelLayout.setHorizontalGroup(
            randomTabPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(randomTabPanelLayout.createSequentialGroup()
                .addContainerGap()
                .add(modelSelectorPanel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addContainerGap())
        );
        randomTabPanelLayout.setVerticalGroup(
            randomTabPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(org.jdesktop.layout.GroupLayout.TRAILING, randomTabPanelLayout.createSequentialGroup()
                .addContainerGap(20, Short.MAX_VALUE)
                .add(modelSelectorPanel, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
        );

        tabbedPane.addTab("Random", null, randomTabPanel, "Contains models and their settings.");

        bottomSidebarPanel.setPreferredSize(new java.awt.Dimension(237, 230));

        configLayeredPane.setPreferredSize(new java.awt.Dimension(237, 194));

        defaultConfigPanel.setPreferredSize(new java.awt.Dimension(237, 194));

        titleLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        titleLabel.setText("Modelling Intelligence Lab");

        universityLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        universityLabel.setText("West Virginia University");

        milImageLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        milImageLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/us/menzies/plot/logo.gif"))); // NOI18N

        org.jdesktop.layout.GroupLayout defaultConfigPanelLayout = new org.jdesktop.layout.GroupLayout(defaultConfigPanel);
        defaultConfigPanel.setLayout(defaultConfigPanelLayout);
        defaultConfigPanelLayout.setHorizontalGroup(
            defaultConfigPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(org.jdesktop.layout.GroupLayout.TRAILING, defaultConfigPanelLayout.createSequentialGroup()
                .addContainerGap()
                .add(defaultConfigPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING)
                    .add(org.jdesktop.layout.GroupLayout.LEADING, milImageLabel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 197, Short.MAX_VALUE)
                    .add(titleLabel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 197, Short.MAX_VALUE)
                    .add(universityLabel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 197, Short.MAX_VALUE))
                .addContainerGap())
        );
        defaultConfigPanelLayout.setVerticalGroup(
            defaultConfigPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(org.jdesktop.layout.GroupLayout.TRAILING, defaultConfigPanelLayout.createSequentialGroup()
                .addContainerGap()
                .add(titleLabel)
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(milImageLabel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 110, Short.MAX_VALUE)
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(universityLabel)
                .add(26, 26, 26))
        );

        defaultConfigPanel.setBounds(0, 0, 237, 194);
        configLayeredPane.add(defaultConfigPanel, javax.swing.JLayeredPane.DEFAULT_LAYER);

        evettConfigPanel.setPreferredSize(new java.awt.Dimension(237, 194));
        evettConfigPanel.setVisible(false);

        evettLambdaLabel.setLabelFor(evettLambdaSlider);
        evettLambdaLabel.setText("lambda");

        evettLambdaSlider.setMaximum(10);
        evettLambdaSlider.setValue(5);

        evettLambdaField.setHorizontalAlignment(javax.swing.JTextField.RIGHT);

        binding = org.jdesktop.beansbinding.Bindings.createAutoBinding(org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, evettLambdaSlider, org.jdesktop.beansbinding.ELProperty.create("${value}"), evettLambdaField, org.jdesktop.beansbinding.BeanProperty.create("text"));
        bindingGroup.addBinding(binding);

        evettFValuesLabel.setLabelFor(evettFValuesSlider);
        evettFValuesLabel.setText("f-values");

        evettFValuesSlider.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
            public void mouseDragged(java.awt.event.MouseEvent evt) {
                evettFValuesSliderMouseDragged(evt);
            }
        });
        evettFValuesSlider.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseReleased(java.awt.event.MouseEvent evt) {
                evettFValuesSliderMouseReleased(evt);
            }
        });

        evettFValuesField.setHorizontalAlignment(javax.swing.JTextField.RIGHT);
        evettFValuesField.setText("0.1300");
        evettFValuesSliderMouseDragged(null);
        evettFValuesField.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyReleased(java.awt.event.KeyEvent evt) {
                evettFValuesFieldKeyReleased(evt);
            }
        });

        evettNLabel.setLabelFor(evettNSlider);
        evettNLabel.setText("n");

        evettNSlider.setMaximum(5);
        evettNSlider.setValue(3);

        evettNField.setHorizontalAlignment(javax.swing.JTextField.RIGHT);

        binding = org.jdesktop.beansbinding.Bindings.createAutoBinding(org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, evettNSlider, org.jdesktop.beansbinding.ELProperty.create("${value}"), evettNField, org.jdesktop.beansbinding.BeanProperty.create("text"));
        bindingGroup.addBinding(binding);

        org.jdesktop.layout.GroupLayout evettConfigPanelLayout = new org.jdesktop.layout.GroupLayout(evettConfigPanel);
        evettConfigPanel.setLayout(evettConfigPanelLayout);
        evettConfigPanelLayout.setHorizontalGroup(
            evettConfigPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(evettConfigPanelLayout.createSequentialGroup()
                .addContainerGap()
                .add(evettConfigPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                    .add(evettNLabel)
                    .add(evettConfigPanelLayout.createSequentialGroup()
                        .add(evettNSlider, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 107, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                        .add(evettNField, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 84, Short.MAX_VALUE))
                    .add(evettConfigPanelLayout.createSequentialGroup()
                        .add(evettLambdaSlider, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 107, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                        .add(evettLambdaField, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 84, Short.MAX_VALUE))
                    .add(evettLambdaLabel)
                    .add(evettFValuesLabel)
                    .add(evettConfigPanelLayout.createSequentialGroup()
                        .add(evettFValuesSlider, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 107, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                        .add(evettFValuesField, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 84, Short.MAX_VALUE)))
                .addContainerGap())
        );
        evettConfigPanelLayout.setVerticalGroup(
            evettConfigPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(evettConfigPanelLayout.createSequentialGroup()
                .add(evettConfigPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING)
                    .add(evettConfigPanelLayout.createSequentialGroup()
                        .add(evettLambdaLabel)
                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                        .add(evettLambdaSlider, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                    .add(evettLambdaField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(evettConfigPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING)
                    .add(evettConfigPanelLayout.createSequentialGroup()
                        .add(evettFValuesLabel)
                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                        .add(evettFValuesSlider, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                    .add(evettFValuesField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(evettConfigPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING)
                    .add(evettConfigPanelLayout.createSequentialGroup()
                        .add(evettNLabel)
                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                        .add(evettNSlider, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                    .add(evettNField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        evettConfigPanel.setBounds(0, 0, 237, 194);
        configLayeredPane.add(evettConfigPanel, javax.swing.JLayeredPane.DEFAULT_LAYER);

        groveConfigPanel.setPreferredSize(new java.awt.Dimension(237, 194));
        groveConfigPanel.setVisible(false);
        groveConfigPanel.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseEntered(java.awt.event.MouseEvent evt) {
                groveConfigPanelMouseEntered(evt);
            }
        });

        groveSlidersPanel.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseExited(java.awt.event.MouseEvent evt) {
                groveSlidersPanelMouseExited(evt);
            }
        });

        groveXPanel.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseExited(java.awt.event.MouseEvent evt) {
                groveXPanelMouseExited(evt);
            }
            public void mouseEntered(java.awt.event.MouseEvent evt) {
                groveXPanelMouseEntered(evt);
            }
        });

        groveXSlider.setOrientation(javax.swing.JSlider.VERTICAL);
        groveXSlider.setPreferredSize(new java.awt.Dimension(29, 73));
        groveXSlider.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
            public void mouseDragged(java.awt.event.MouseEvent evt) {
                groveXSliderMouseDragged(evt);
            }
        });
        groveXSlider.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseReleased(java.awt.event.MouseEvent evt) {
                groveXSliderMouseReleased(evt);
            }
            public void mouseEntered(java.awt.event.MouseEvent evt) {
                groveXSliderMouseEntered(evt);
            }
        });

        groveXLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        groveXLabel.setLabelFor(groveXSlider);
        groveXLabel.setText("x");
        groveXLabel.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseReleased(java.awt.event.MouseEvent evt) {
                groveXLabelMouseReleased(evt);
            }
        });

        org.jdesktop.layout.GroupLayout groveXLabelPanelLayout = new org.jdesktop.layout.GroupLayout(groveXLabelPanel);
        groveXLabelPanel.setLayout(groveXLabelPanelLayout);
        groveXLabelPanelLayout.setHorizontalGroup(
            groveXLabelPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(groveXLabel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 29, Short.MAX_VALUE)
        );
        groveXLabelPanelLayout.setVerticalGroup(
            groveXLabelPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(groveXLabel)
        );

        org.jdesktop.layout.GroupLayout groveXPanelLayout = new org.jdesktop.layout.GroupLayout(groveXPanel);
        groveXPanel.setLayout(groveXPanelLayout);
        groveXPanelLayout.setHorizontalGroup(
            groveXPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(groveXLabelPanel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
            .add(groveXSlider, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
        );
        groveXPanelLayout.setVerticalGroup(
            groveXPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(groveXPanelLayout.createSequentialGroup()
                .add(groveXSlider, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(groveXLabelPanel, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
        );

        groveYPanel.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseExited(java.awt.event.MouseEvent evt) {
                groveYPanelMouseExited(evt);
            }
            public void mouseEntered(java.awt.event.MouseEvent evt) {
                groveYPanelMouseEntered(evt);
            }
        });

        groveYSlider.setOrientation(javax.swing.JSlider.VERTICAL);
        groveYSlider.setPreferredSize(new java.awt.Dimension(29, 73));
        groveYSlider.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
            public void mouseDragged(java.awt.event.MouseEvent evt) {
                groveYSliderMouseDragged(evt);
            }
        });
        groveYSlider.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseReleased(java.awt.event.MouseEvent evt) {
                groveYSliderMouseReleased(evt);
            }
            public void mouseEntered(java.awt.event.MouseEvent evt) {
                groveYSliderMouseEntered(evt);
            }
        });

        groveYLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        groveYLabel.setLabelFor(groveYSlider);
        groveYLabel.setText("y");
        groveYLabel.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseReleased(java.awt.event.MouseEvent evt) {
                groveYLabelMouseReleased(evt);
            }
        });

        org.jdesktop.layout.GroupLayout groveYLabelPanelLayout = new org.jdesktop.layout.GroupLayout(groveYLabelPanel);
        groveYLabelPanel.setLayout(groveYLabelPanelLayout);
        groveYLabelPanelLayout.setHorizontalGroup(
            groveYLabelPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(groveYLabel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 29, Short.MAX_VALUE)
        );
        groveYLabelPanelLayout.setVerticalGroup(
            groveYLabelPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(groveYLabel)
        );

        org.jdesktop.layout.GroupLayout groveYPanelLayout = new org.jdesktop.layout.GroupLayout(groveYPanel);
        groveYPanel.setLayout(groveYPanelLayout);
        groveYPanelLayout.setHorizontalGroup(
            groveYPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(groveYLabelPanel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
            .add(groveYSlider, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
        );
        groveYPanelLayout.setVerticalGroup(
            groveYPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(groveYPanelLayout.createSequentialGroup()
                .add(groveYSlider, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(groveYLabelPanel, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
        );

        groveSDPanel.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseExited(java.awt.event.MouseEvent evt) {
                groveSDPanelMouseExited(evt);
            }
            public void mouseEntered(java.awt.event.MouseEvent evt) {
                groveSDPanelMouseEntered(evt);
            }
        });

        groveSDSlider.setOrientation(javax.swing.JSlider.VERTICAL);
        groveSDSlider.setPreferredSize(new java.awt.Dimension(29, 73));
        groveSDSlider.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
            public void mouseDragged(java.awt.event.MouseEvent evt) {
                groveSDSliderMouseDragged(evt);
            }
        });
        groveSDSlider.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseReleased(java.awt.event.MouseEvent evt) {
                groveSDSliderMouseReleased(evt);
            }
            public void mouseEntered(java.awt.event.MouseEvent evt) {
                groveSDSliderMouseEntered(evt);
            }
        });

        groveSDLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        groveSDLabel.setLabelFor(groveSDSlider);
        groveSDLabel.setText("sd");
        groveSDLabel.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseReleased(java.awt.event.MouseEvent evt) {
                groveSDLabelMouseReleased(evt);
            }
        });

        org.jdesktop.layout.GroupLayout groveSDLabelPanelLayout = new org.jdesktop.layout.GroupLayout(groveSDLabelPanel);
        groveSDLabelPanel.setLayout(groveSDLabelPanelLayout);
        groveSDLabelPanelLayout.setHorizontalGroup(
            groveSDLabelPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(groveSDLabel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 29, Short.MAX_VALUE)
        );
        groveSDLabelPanelLayout.setVerticalGroup(
            groveSDLabelPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(groveSDLabel)
        );

        org.jdesktop.layout.GroupLayout groveSDPanelLayout = new org.jdesktop.layout.GroupLayout(groveSDPanel);
        groveSDPanel.setLayout(groveSDPanelLayout);
        groveSDPanelLayout.setHorizontalGroup(
            groveSDPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(groveSDLabelPanel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
            .add(groveSDSlider, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
        );
        groveSDPanelLayout.setVerticalGroup(
            groveSDPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(groveSDPanelLayout.createSequentialGroup()
                .add(groveSDSlider, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(groveSDLabelPanel, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
        );

        groveMuPanel.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseExited(java.awt.event.MouseEvent evt) {
                groveMuPanelMouseExited(evt);
            }
            public void mouseEntered(java.awt.event.MouseEvent evt) {
                groveMuPanelMouseEntered(evt);
            }
        });

        groveMuSlider.setOrientation(javax.swing.JSlider.VERTICAL);
        groveMuSlider.setPreferredSize(new java.awt.Dimension(29, 73));
        groveMuSlider.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
            public void mouseDragged(java.awt.event.MouseEvent evt) {
                groveMuSliderMouseDragged(evt);
            }
        });
        groveMuSlider.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseReleased(java.awt.event.MouseEvent evt) {
                groveMuSliderMouseReleased(evt);
            }
            public void mouseEntered(java.awt.event.MouseEvent evt) {
                groveMuSliderMouseEntered(evt);
            }
        });

        groveMuLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        groveMuLabel.setLabelFor(groveMuSlider);
        groveMuLabel.setText("mu");
        groveMuLabel.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseReleased(java.awt.event.MouseEvent evt) {
                groveMuLabelMouseReleased(evt);
            }
        });

        org.jdesktop.layout.GroupLayout groveMuLabelPanelLayout = new org.jdesktop.layout.GroupLayout(groveMuLabelPanel);
        groveMuLabelPanel.setLayout(groveMuLabelPanelLayout);
        groveMuLabelPanelLayout.setHorizontalGroup(
            groveMuLabelPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(groveMuLabel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 29, Short.MAX_VALUE)
        );
        groveMuLabelPanelLayout.setVerticalGroup(
            groveMuLabelPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(groveMuLabel)
        );

        org.jdesktop.layout.GroupLayout groveMuPanelLayout = new org.jdesktop.layout.GroupLayout(groveMuPanel);
        groveMuPanel.setLayout(groveMuPanelLayout);
        groveMuPanelLayout.setHorizontalGroup(
            groveMuPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(groveMuLabelPanel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
            .add(groveMuSlider, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
        );
        groveMuPanelLayout.setVerticalGroup(
            groveMuPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(groveMuPanelLayout.createSequentialGroup()
                .add(groveMuSlider, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(groveMuLabelPanel, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
        );

        groveTauPanel.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseExited(java.awt.event.MouseEvent evt) {
                groveTauPanelMouseExited(evt);
            }
            public void mouseEntered(java.awt.event.MouseEvent evt) {
                groveTauPanelMouseEntered(evt);
            }
        });

        groveTauSlider.setOrientation(javax.swing.JSlider.VERTICAL);
        groveTauSlider.setPreferredSize(new java.awt.Dimension(29, 73));
        groveTauSlider.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
            public void mouseDragged(java.awt.event.MouseEvent evt) {
                groveTauSliderMouseDragged(evt);
            }
        });
        groveTauSlider.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseReleased(java.awt.event.MouseEvent evt) {
                groveTauSliderMouseReleased(evt);
            }
            public void mouseEntered(java.awt.event.MouseEvent evt) {
                groveTauSliderMouseEntered(evt);
            }
        });

        groveTauLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        groveTauLabel.setLabelFor(groveTauSlider);
        groveTauLabel.setText("tau");
        groveTauLabel.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseReleased(java.awt.event.MouseEvent evt) {
                groveTauLabelMouseReleased(evt);
            }
        });

        org.jdesktop.layout.GroupLayout groveTauLabelPanelLayout = new org.jdesktop.layout.GroupLayout(groveTauLabelPanel);
        groveTauLabelPanel.setLayout(groveTauLabelPanelLayout);
        groveTauLabelPanelLayout.setHorizontalGroup(
            groveTauLabelPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(groveTauLabel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 29, Short.MAX_VALUE)
        );
        groveTauLabelPanelLayout.setVerticalGroup(
            groveTauLabelPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(groveTauLabel)
        );

        org.jdesktop.layout.GroupLayout groveTauPanelLayout = new org.jdesktop.layout.GroupLayout(groveTauPanel);
        groveTauPanel.setLayout(groveTauPanelLayout);
        groveTauPanelLayout.setHorizontalGroup(
            groveTauPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(groveTauLabelPanel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
            .add(groveTauSlider, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
        );
        groveTauPanelLayout.setVerticalGroup(
            groveTauPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(groveTauPanelLayout.createSequentialGroup()
                .add(groveTauSlider, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(groveTauLabelPanel, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
        );

        org.jdesktop.layout.GroupLayout groveSlidersPanelLayout = new org.jdesktop.layout.GroupLayout(groveSlidersPanel);
        groveSlidersPanel.setLayout(groveSlidersPanelLayout);
        groveSlidersPanelLayout.setHorizontalGroup(
            groveSlidersPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(groveSlidersPanelLayout.createSequentialGroup()
                .add(groveXPanel, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(groveYPanel, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(groveSDPanel, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(groveMuPanel, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(groveTauPanel, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        groveSlidersPanelLayout.setVerticalGroup(
            groveSlidersPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(groveSlidersPanelLayout.createSequentialGroup()
                .add(groveSlidersPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                    .add(groveXPanel, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .add(groveYPanel, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .add(groveSDPanel, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .add(groveMuPanel, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .add(groveTauPanel, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                .addContainerGap())
        );

        groveStatusLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        groveStatusLabel.setText("Click a value to edit.");

        org.jdesktop.layout.GroupLayout groveStatusPanelLayout = new org.jdesktop.layout.GroupLayout(groveStatusPanel);
        groveStatusPanel.setLayout(groveStatusPanelLayout);
        groveStatusPanelLayout.setHorizontalGroup(
            groveStatusPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(groveStatusLabel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 200, Short.MAX_VALUE)
        );
        groveStatusPanelLayout.setVerticalGroup(
            groveStatusPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(groveStatusPanelLayout.createSequentialGroup()
                .add(groveStatusLabel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 20, Short.MAX_VALUE)
                .addContainerGap())
        );

        groveStatusPanel.setBounds(0, 0, 200, 40);
        groveStatusPane.add(groveStatusPanel, javax.swing.JLayeredPane.PALETTE_LAYER);

        groveConfigEditorPanel.setVisible(false);

        groveEditField.setHorizontalAlignment(javax.swing.JTextField.RIGHT);
        groveEditField.setText("value");

        groveEditLabel.setText("varname");

        org.jdesktop.layout.GroupLayout groveEditorPanelLayout = new org.jdesktop.layout.GroupLayout(groveEditorPanel);
        groveEditorPanel.setLayout(groveEditorPanelLayout);
        groveEditorPanelLayout.setHorizontalGroup(
            groveEditorPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(org.jdesktop.layout.GroupLayout.TRAILING, groveEditorPanelLayout.createSequentialGroup()
                .add(groveEditLabel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 65, Short.MAX_VALUE)
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(groveEditField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 85, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
        );
        groveEditorPanelLayout.setVerticalGroup(
            groveEditorPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(groveEditorPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                .add(groveEditField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .add(groveEditLabel))
        );

        org.jdesktop.layout.GroupLayout groveConfigEditorPanelLayout = new org.jdesktop.layout.GroupLayout(groveConfigEditorPanel);
        groveConfigEditorPanel.setLayout(groveConfigEditorPanelLayout);
        groveConfigEditorPanelLayout.setHorizontalGroup(
            groveConfigEditorPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(org.jdesktop.layout.GroupLayout.TRAILING, groveConfigEditorPanelLayout.createSequentialGroup()
                .addContainerGap()
                .add(groveEditorPanel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addContainerGap())
        );
        groveConfigEditorPanelLayout.setVerticalGroup(
            groveConfigEditorPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(groveEditorPanel, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
        );

        groveConfigEditorPanel.setBounds(0, 0, 200, 40);
        groveStatusPane.add(groveConfigEditorPanel, javax.swing.JLayeredPane.DEFAULT_LAYER);

        org.jdesktop.layout.GroupLayout groveConfigPanelLayout = new org.jdesktop.layout.GroupLayout(groveConfigPanel);
        groveConfigPanel.setLayout(groveConfigPanelLayout);
        groveConfigPanelLayout.setHorizontalGroup(
            groveConfigPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(groveConfigPanelLayout.createSequentialGroup()
                .add(groveConfigPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                    .add(groveConfigPanelLayout.createSequentialGroup()
                        .add(45, 45, 45)
                        .add(groveSlidersPanel, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                    .add(groveConfigPanelLayout.createSequentialGroup()
                        .addContainerGap()
                        .add(groveStatusPane, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 197, Short.MAX_VALUE)))
                .addContainerGap())
        );
        groveConfigPanelLayout.setVerticalGroup(
            groveConfigPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(groveConfigPanelLayout.createSequentialGroup()
                .add(20, 20, 20)
                .add(groveSlidersPanel, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(groveStatusPane, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 39, Short.MAX_VALUE)
                .addContainerGap())
        );

        groveConfigPanel.setBounds(0, 0, 237, 194);
        configLayeredPane.add(groveConfigPanel, javax.swing.JLayeredPane.DEFAULT_LAYER);

        seheultConfigPanel.setMinimumSize(new java.awt.Dimension(237, 194));
        seheultConfigPanel.setPreferredSize(new java.awt.Dimension(237, 204));
        seheultConfigPanel.setVisible(false);

        org.jdesktop.layout.GroupLayout seheultConfigPanelLayout = new org.jdesktop.layout.GroupLayout(seheultConfigPanel);
        seheultConfigPanel.setLayout(seheultConfigPanelLayout);
        seheultConfigPanelLayout.setHorizontalGroup(
            seheultConfigPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(0, 237, Short.MAX_VALUE)
        );
        seheultConfigPanelLayout.setVerticalGroup(
            seheultConfigPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(0, 204, Short.MAX_VALUE)
        );

        seheultConfigPanel.setBounds(0, 0, -1, -1);
        configLayeredPane.add(seheultConfigPanel, javax.swing.JLayeredPane.DEFAULT_LAYER);

        walshConfigPanel.setMinimumSize(new java.awt.Dimension(237, 194));
        walshConfigPanel.setPreferredSize(new java.awt.Dimension(237, 204));
        walshConfigPanel.setVisible(false);

        org.jdesktop.layout.GroupLayout walshConfigPanelLayout = new org.jdesktop.layout.GroupLayout(walshConfigPanel);
        walshConfigPanel.setLayout(walshConfigPanelLayout);
        walshConfigPanelLayout.setHorizontalGroup(
            walshConfigPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(0, 237, Short.MAX_VALUE)
        );
        walshConfigPanelLayout.setVerticalGroup(
            walshConfigPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(0, 204, Short.MAX_VALUE)
        );

        walshConfigPanel.setBounds(0, 0, -1, -1);
        configLayeredPane.add(walshConfigPanel, javax.swing.JLayeredPane.DEFAULT_LAYER);

        plotButton.setText("Plot!");
        plotButton.setActionCommand("plot");
        plotButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                plotButtonActionPerformed(evt);
            }
        });

        org.jdesktop.layout.GroupLayout bottomSidebarPanelLayout = new org.jdesktop.layout.GroupLayout(bottomSidebarPanel);
        bottomSidebarPanel.setLayout(bottomSidebarPanelLayout);
        bottomSidebarPanelLayout.setHorizontalGroup(
            bottomSidebarPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(configLayeredPane, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
            .add(bottomSidebarPanelLayout.createSequentialGroup()
                .addContainerGap()
                .add(plotButton, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 203, Short.MAX_VALUE)
                .addContainerGap())
        );
        bottomSidebarPanelLayout.setVerticalGroup(
            bottomSidebarPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(org.jdesktop.layout.GroupLayout.TRAILING, bottomSidebarPanelLayout.createSequentialGroup()
                .add(configLayeredPane, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 194, Short.MAX_VALUE)
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(plotButton))
        );

        org.jdesktop.layout.GroupLayout sidebarPanelLayout = new org.jdesktop.layout.GroupLayout(sidebarPanel);
        sidebarPanel.setLayout(sidebarPanelLayout);
        sidebarPanelLayout.setHorizontalGroup(
            sidebarPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(org.jdesktop.layout.GroupLayout.TRAILING, tabbedPane, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
            .add(bottomSidebarPanel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );
        sidebarPanelLayout.setVerticalGroup(
            sidebarPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(sidebarPanelLayout.createSequentialGroup()
                .add(tabbedPane, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 250, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(bottomSidebarPanel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        canvasPanel.setFocusable(false);
        canvasPanel.setPreferredSize(new java.awt.Dimension(640, 480));
        canvasPanel.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseEntered(java.awt.event.MouseEvent evt) {
                canvasPanelMouseEntered(evt);
            }
        });
        canvasPanel.setLayout(new java.awt.BorderLayout());
        canvasPanel.add(internalAWTCanvas, java.awt.BorderLayout.CENTER);

        org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(layout.createSequentialGroup()
                .addContainerGap()
                .add(sidebarPanel, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(canvasPanel, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup()
                .addContainerGap()
                .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING)
                    .add(org.jdesktop.layout.GroupLayout.LEADING, sidebarPanel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .add(org.jdesktop.layout.GroupLayout.LEADING, canvasPanel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 480, Short.MAX_VALUE))
                .addContainerGap())
        );

        bindingGroup.bind();

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void plotButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_plotButtonActionPerformed
        // TODO add your handling code here:
    }//GEN-LAST:event_plotButtonActionPerformed

    private void modelSelectorActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_modelSelectorActionPerformed
        switch(getSelectedModelID()) {
            case MODEL_EVETT:
                switchToConfigPanel(evettConfigPanel);
                break;
            case MODEL_GROVE:
                switchToConfigPanel(groveConfigPanel);
                break;
            case MODEL_SEHEULT:
                switchToConfigPanel(seheultConfigPanel);
                break;
            case MODEL_WALSH:
                switchToConfigPanel(walshConfigPanel);
                break;
            default:
                switchToConfigPanel(defaultConfigPanel);
                break;
        }
    }//GEN-LAST:event_modelSelectorActionPerformed

    private void formMouseDragged(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_formMouseDragged
        canvasPanel.setSize(getWidth()-canvasPanel.getX()-component3DSpaceWidth, getHeight()-canvasPanel.getY()-component3DSpaceHeight);
    }//GEN-LAST:event_formMouseDragged

    private void sidebarPanelMouseEntered(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_sidebarPanelMouseEntered
        resetAllStatusLabels();
    }//GEN-LAST:event_sidebarPanelMouseEntered

    private void tabbedPaneMouseEntered(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_tabbedPaneMouseEntered
        resetAllStatusLabels();
    }//GEN-LAST:event_tabbedPaneMouseEntered

    private void canvasPanelMouseEntered(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_canvasPanelMouseEntered
        resetAllStatusLabels();
    }//GEN-LAST:event_canvasPanelMouseEntered

    private void formMouseEntered(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_formMouseEntered
        resetAllStatusLabels();
    }//GEN-LAST:event_formMouseEntered

    private void evettFValuesFieldKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_evettFValuesFieldKeyReleased
        updateFValuesSliderFromField();
}//GEN-LAST:event_evettFValuesFieldKeyReleased

    private void evettFValuesSliderMouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_evettFValuesSliderMouseReleased
        updateFValuesFieldFromSlider();
}//GEN-LAST:event_evettFValuesSliderMouseReleased

    private void evettFValuesSliderMouseDragged(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_evettFValuesSliderMouseDragged
        updateFValuesFieldFromSlider();
}//GEN-LAST:event_evettFValuesSliderMouseDragged

    private void groveConfigPanelMouseEntered(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_groveConfigPanelMouseEntered
        resetGroveStatusLabel();
}//GEN-LAST:event_groveConfigPanelMouseEntered

    private void groveSlidersPanelMouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_groveSlidersPanelMouseExited
        if(!isGroveEditorShown) resetGroveStatusLabel();
}//GEN-LAST:event_groveSlidersPanelMouseExited

    private void groveTauPanelMouseEntered(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_groveTauPanelMouseEntered
        updateGroveStatusForTau();
}//GEN-LAST:event_groveTauPanelMouseEntered

    private void groveTauPanelMouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_groveTauPanelMouseExited
        if(!isGroveEditorShown) resetGroveStatusLabel();
}//GEN-LAST:event_groveTauPanelMouseExited

    private void groveTauLabelMouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_groveTauLabelMouseReleased
        groveTauSliderMouseReleased(evt);
}//GEN-LAST:event_groveTauLabelMouseReleased

    private void groveTauSliderMouseEntered(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_groveTauSliderMouseEntered
        updateGroveStatusForTau();
}//GEN-LAST:event_groveTauSliderMouseEntered

    private void groveTauSliderMouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_groveTauSliderMouseReleased
        showGroveEditor(GROVE_TAU);
}//GEN-LAST:event_groveTauSliderMouseReleased

    private void groveTauSliderMouseDragged(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_groveTauSliderMouseDragged
        updateGroveStatusForTau();
}//GEN-LAST:event_groveTauSliderMouseDragged

    private void groveMuPanelMouseEntered(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_groveMuPanelMouseEntered
        updateGroveStatusForMu();
}//GEN-LAST:event_groveMuPanelMouseEntered

    private void groveMuPanelMouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_groveMuPanelMouseExited
        if(!isGroveEditorShown) resetGroveStatusLabel();
}//GEN-LAST:event_groveMuPanelMouseExited

    private void groveMuLabelMouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_groveMuLabelMouseReleased
        groveMuSliderMouseReleased(evt);
}//GEN-LAST:event_groveMuLabelMouseReleased

    private void groveMuSliderMouseEntered(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_groveMuSliderMouseEntered
        updateGroveStatusForMu();
}//GEN-LAST:event_groveMuSliderMouseEntered

    private void groveMuSliderMouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_groveMuSliderMouseReleased
        showGroveEditor(GROVE_MU);
}//GEN-LAST:event_groveMuSliderMouseReleased

    private void groveMuSliderMouseDragged(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_groveMuSliderMouseDragged
        updateGroveStatusForMu();
}//GEN-LAST:event_groveMuSliderMouseDragged

    private void groveSDPanelMouseEntered(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_groveSDPanelMouseEntered
        updateGroveStatusForSD();
}//GEN-LAST:event_groveSDPanelMouseEntered

    private void groveSDPanelMouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_groveSDPanelMouseExited
        if(!isGroveEditorShown) resetGroveStatusLabel();
}//GEN-LAST:event_groveSDPanelMouseExited

    private void groveSDLabelMouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_groveSDLabelMouseReleased
        groveSDSliderMouseReleased(evt);
}//GEN-LAST:event_groveSDLabelMouseReleased

    private void groveSDSliderMouseEntered(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_groveSDSliderMouseEntered
        updateGroveStatusForSD();
}//GEN-LAST:event_groveSDSliderMouseEntered

    private void groveSDSliderMouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_groveSDSliderMouseReleased
        showGroveEditor(GROVE_SD);
}//GEN-LAST:event_groveSDSliderMouseReleased

    private void groveSDSliderMouseDragged(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_groveSDSliderMouseDragged
        updateGroveStatusForSD();
}//GEN-LAST:event_groveSDSliderMouseDragged

    private void groveYPanelMouseEntered(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_groveYPanelMouseEntered
        updateGroveStatusForY();
}//GEN-LAST:event_groveYPanelMouseEntered

    private void groveYPanelMouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_groveYPanelMouseExited
        if(!isGroveEditorShown) resetGroveStatusLabel();
}//GEN-LAST:event_groveYPanelMouseExited

    private void groveYLabelMouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_groveYLabelMouseReleased
        groveYSliderMouseReleased(evt);
}//GEN-LAST:event_groveYLabelMouseReleased

    private void groveYSliderMouseEntered(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_groveYSliderMouseEntered
        updateGroveStatusForY();
}//GEN-LAST:event_groveYSliderMouseEntered

    private void groveYSliderMouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_groveYSliderMouseReleased
        showGroveEditor(GROVE_Y);
}//GEN-LAST:event_groveYSliderMouseReleased

    private void groveYSliderMouseDragged(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_groveYSliderMouseDragged
        updateGroveStatusForY();
}//GEN-LAST:event_groveYSliderMouseDragged

    private void groveXPanelMouseEntered(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_groveXPanelMouseEntered
        updateGroveStatusForX();
}//GEN-LAST:event_groveXPanelMouseEntered

    private void groveXPanelMouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_groveXPanelMouseExited
        if(!isGroveEditorShown) resetGroveStatusLabel();
}//GEN-LAST:event_groveXPanelMouseExited

    private void groveXLabelMouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_groveXLabelMouseReleased
        groveXSliderMouseReleased(evt);
}//GEN-LAST:event_groveXLabelMouseReleased

    private void groveXSliderMouseEntered(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_groveXSliderMouseEntered
        updateGroveStatusForX();
}//GEN-LAST:event_groveXSliderMouseEntered

    private void groveXSliderMouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_groveXSliderMouseReleased
        showGroveEditor(GROVE_X);
}//GEN-LAST:event_groveXSliderMouseReleased

    private void groveXSliderMouseDragged(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_groveXSliderMouseDragged
        updateGroveStatusForX();
}//GEN-LAST:event_groveXSliderMouseDragged

    private void updateFValuesFieldFromSlider() {
        java.math.BigDecimal bd = new java.math.BigDecimal(getEvettFValues());
        int numDecimalPlaces = 4;
        bd = bd.setScale(numDecimalPlaces, java.math.BigDecimal.ROUND_HALF_UP);
        evettFValuesField.setText(bd.toPlainString());
    }

    private void updateFValuesSliderFromField() {
        double value = 0.0;
        try {
            value = java.lang.Double.parseDouble(evettFValuesField.getText());
            int ticks = (int)java.lang.Math.round(java.lang.Math.floor(416.66666667*(value-0.01)));
            evettFValuesSlider.setValue(ticks);
        } catch(NumberFormatException e) {}
    }

    private void resetGroveStatusLabel() {
        groveStatusLabel.setText("Click a value to edit.");
        hideGroveEditor();
    }

    private void resetAllStatusLabels() {
        resetGroveStatusLabel();
    }

    private void updateGroveStatusForX() {
        groveStatusLabel.setText("x: " + String.valueOf(getGroveX()));
    }

    private void updateGroveStatusForY() {
        groveStatusLabel.setText("y: " + String.valueOf(getGroveY()));
    }

    private void updateGroveStatusForSD() {
        groveStatusLabel.setText("sd: " + String.valueOf(getGroveSD()));
    }

    private void updateGroveStatusForMu() {
        groveStatusLabel.setText("mu: " + String.valueOf(getGroveMu()));
    }

    private void updateGroveStatusForTau() {
        groveStatusLabel.setText("tau: " + String.valueOf(getGroveTau()));
    }

    private void handleGroveEditing(boolean triggerEditor) {
        isGroveEditorShown = triggerEditor;
        javax.swing.JPanel whichtoshow = triggerEditor? groveConfigEditorPanel : groveStatusPanel;
        javax.swing.JPanel whichnottoshow = triggerEditor? groveStatusPanel : groveConfigEditorPanel;
        whichtoshow.setVisible(false);
        whichnottoshow.setVisible(false);
        groveStatusPane.setLayer(whichtoshow, javax.swing.JLayeredPane.PALETTE_LAYER);
        groveStatusPane.setLayer(whichnottoshow, javax.swing.JLayeredPane.DEFAULT_LAYER);
        whichtoshow.setVisible(true);
    }

    private void updateGroveEditor() {
        groveEditLabel.setText(getGroveEditorVariableName());
        groveEditField.setText(String.valueOf(getGroveEditorVariableValue()));
    }
    
    private synchronized void setGroveEditorVariable(int whichVariable) {
        groveEditorVariable = whichVariable;
        updateGroveEditor();
    }

    private void showGroveEditor(int whichVariable) {
        setGroveEditorVariable(whichVariable);
        handleGroveEditing(true);
        groveEditField.requestFocusInWindow();
    }

    private void hideGroveEditor() {
        handleGroveEditing(false);
    }

    private java.lang.String getGroveEditorVariableName() {
        String ret = null;
        switch(groveEditorVariable) {
            case GROVE_X:
                ret = "x";
                break;
            case GROVE_Y:
                ret = "y";
                break;
            case GROVE_SD:
                ret = "sd";
                break;
            case GROVE_MU:
                ret = "mu";
                break;
            case GROVE_TAU:
                ret = "tau";
                break;
            default:
                ret = "<error>";
                break;
        }
        return ret;
    }

    private double getGroveEditorVariableValue() {
        double ret = 0.0;
        switch(groveEditorVariable) {
            case GROVE_X:
                ret = getGroveX();
                break;
            case GROVE_Y:
                ret = getGroveY();
                break;
            case GROVE_SD:
                ret = getGroveSD();
                break;
            case GROVE_MU:
                ret = getGroveMu();
                break;
            case GROVE_TAU:
                ret = getGroveTau();
                break;
        }
        return ret;
    }

    private void setGroveVariableFromEditor(double value) {
        switch(groveEditorVariable) {
            case GROVE_X:
                setGroveX(value);
                break;
            case GROVE_Y:
                setGroveY(value);
                break;
            case GROVE_SD:
                setGroveSD(value);
                break;
            case GROVE_MU:
                setGroveMu(value);
                break;
            case GROVE_TAU:
                setGroveTau(value);
                break;
        }
    }

    private void setGroveX(double value) {
    }

    private void setGroveY(double value) {
    }

    private void setGroveSD(double value) {
    }

    private void setGroveMu(double value) {
    }

    private void setGroveTau(double value) {
    }

    public double getGroveX() {
        return 0.0;
    }

    public double getGroveY() {
        return 0.0;
    }

    public double getGroveSD() {
        return 0.0;
    }

    public double getGroveMu() {
        return 0.0;
    }

    public double getGroveTau() {
        return 0.0;
    }

    /**
    * @param args the command line arguments
    */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new PlotWindow().setVisible(true);
            }
        });
    }

    private javax.media.j3d.Canvas3D canvas;
    private javax.media.j3d.BranchGroup graphRoot;
    private javax.media.j3d.TransformGroup baseTransformGroup;
    private javax.media.j3d.TransformGroup transformGroup;
    private javax.media.j3d.BranchGroup hingeBranch;
    private com.sun.j3d.utils.universe.SimpleUniverse universe;
    private javax.vecmath.Color3f colorWhite;
    private javax.vecmath.Color3f colorBlack;
    private javax.media.j3d.Material axisMaterial;
    private javax.media.j3d.Appearance axisAppearance;

    private int component3DSpaceWidth;
    private int component3DSpaceHeight;

    private boolean isGroveEditorShown = false;
    private int groveEditorVariable = 0;

    private static final float pointDefaultSize = 0.01f;
    public static final int NO_MODEL_SELECTED = 0;
    public static final int MODEL_EVETT = 1;
    public static final int MODEL_GROVE = 2;
    public static final int MODEL_SEHEULT = 3;
    public static final int MODEL_WALSH = 4;
    public static final int GROVE_NO_VAR = 0;
    public static final int GROVE_X = 1;
    public static final int GROVE_Y = 2;
    public static final int GROVE_SD = 3;
    public static final int GROVE_MU = 4;
    public static final int GROVE_TAU = 5;

    private final Object transformGroupIntrinsicLock = new Object();

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JPanel bottomSidebarPanel;
    private javax.swing.JPanel canvasPanel;
    private javax.swing.JLayeredPane configLayeredPane;
    private javax.swing.JPanel defaultConfigPanel;
    private javax.swing.JPanel evettConfigPanel;
    private javax.swing.JTextField evettFValuesField;
    private javax.swing.JLabel evettFValuesLabel;
    private javax.swing.JSlider evettFValuesSlider;
    private javax.swing.JTextField evettLambdaField;
    private javax.swing.JLabel evettLambdaLabel;
    private javax.swing.JSlider evettLambdaSlider;
    private javax.swing.JTextField evettNField;
    private javax.swing.JLabel evettNLabel;
    private javax.swing.JSlider evettNSlider;
    private javax.swing.JCheckBox fastmapCheckBox;
    private javax.swing.JPanel groveConfigEditorPanel;
    private javax.swing.JPanel groveConfigPanel;
    private javax.swing.JTextField groveEditField;
    private javax.swing.JLabel groveEditLabel;
    private javax.swing.JPanel groveEditorPanel;
    private javax.swing.JLabel groveMuLabel;
    private javax.swing.JPanel groveMuLabelPanel;
    private javax.swing.JPanel groveMuPanel;
    private javax.swing.JSlider groveMuSlider;
    private javax.swing.JLabel groveSDLabel;
    private javax.swing.JPanel groveSDLabelPanel;
    private javax.swing.JPanel groveSDPanel;
    private javax.swing.JSlider groveSDSlider;
    private javax.swing.JPanel groveSlidersPanel;
    private javax.swing.JLabel groveStatusLabel;
    private javax.swing.JLayeredPane groveStatusPane;
    private javax.swing.JPanel groveStatusPanel;
    private javax.swing.JLabel groveTauLabel;
    private javax.swing.JPanel groveTauLabelPanel;
    private javax.swing.JPanel groveTauPanel;
    private javax.swing.JSlider groveTauSlider;
    private javax.swing.JLabel groveXLabel;
    private javax.swing.JPanel groveXLabelPanel;
    private javax.swing.JPanel groveXPanel;
    private javax.swing.JSlider groveXSlider;
    private javax.swing.JLabel groveYLabel;
    private javax.swing.JPanel groveYLabelPanel;
    private javax.swing.JPanel groveYPanel;
    private javax.swing.JSlider groveYSlider;
    private javax.swing.JPanel importTabPanel;
    private java.awt.Canvas internalAWTCanvas;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JTextField jTextField1;
    private javax.swing.JLabel milImageLabel;
    private javax.swing.JComboBox modelSelector;
    private javax.swing.JPanel modelSelectorPanel;
    private javax.swing.JTextField nSamplesField;
    private javax.swing.JLabel nSamplesLabel;
    private javax.swing.JButton plotButton;
    private javax.swing.JPanel randomTabPanel;
    private javax.swing.JPanel sampleConfigurationPanel;
    private javax.swing.JSlider sampleSlider;
    private javax.swing.JPanel seheultConfigPanel;
    private javax.swing.JPanel sidebarPanel;
    private javax.swing.JTabbedPane tabbedPane;
    private javax.swing.JLabel titleLabel;
    private javax.swing.JLabel universityLabel;
    private javax.swing.JPanel walshConfigPanel;
    private org.jdesktop.beansbinding.BindingGroup bindingGroup;
    // End of variables declaration//GEN-END:variables

}
