/*
 * SettingsPanel.java
 *
 * Created on December 25, 2000, 10:18 AM
 */

package pharynx;
import java.util.*;
import java.awt.Color;

/**
 *
 * @author  leon@eatworms.swmed.edu
 * @version 0.1
 */
public class SettingsPanel extends javax.swing.JPanel 
    implements SimOptions.Updater {
    SimOptions options;
    SimOptions.Updater updater;

    /** Creates new form SettingsPanel
     *
     * Apparently we need to have this constructor in order for the forte GUI
     * editor to insert this object, even if it's never used.
     */
    public SettingsPanel() {
        options = new SimOptions();
        initComponents ();
        defaultSettings();
        readOptions();
    }

    /** Creates new form SettingsPanel */
    public SettingsPanel(SimOptions.Updater updater) {
        options = new SimOptions();
        this.updater = updater;
        initComponents();
        defaultSettings();
        readOptions();
    }

    private void defaultSettings() {
        corpusMotionSettingsPanel.defaultSettings("0", "133", "133", "150");
        aIsthmusMotionSettingsPanel.defaultSettings("83", "150", "150", "167");
        pIsthmusMotionSettingsPanel.defaultSettings("150", "183", "183", "200");
        ParticleSeries ps = new ParticleSeries();
        ps.n = 1;
        ps.setDiameter(12.3);
        ps.color = new Color(149, 149, 0);
        particleSeriesSettingsPanel1.defaultSettings(ps);
        ps.n = 0;
        ps.color = new Color(0, 198, 0);
        particleSeriesSettingsPanel2.defaultSettings(ps);
        ps.color = new Color(255, 0, 0);
        particleSeriesSettingsPanel3.defaultSettings(ps);
    }

    public boolean readOptions() {
        try {
            options = animationSettingsPanel.getOptions();
            options = snapShotSettingsPanel.getOptions(options);
            options.corpusMotion = corpusMotionSettingsPanel.getMotion();
            options.aIsthmusMotion = aIsthmusMotionSettingsPanel.getMotion();
            options.pIsthmusMotion = pIsthmusMotionSettingsPanel.getMotion();
            options.maxT = options.defaultMaxT();
            options.connectEnds();
            options.particleSeries = new ArrayList();
            options.particleSeries.add(0, particleSeriesSettingsPanel1.getps());
            options.particleSeries.add(1, particleSeriesSettingsPanel2.getps());
            options.particleSeries.add(2, particleSeriesSettingsPanel3.getps());
            settingsGraphPanel.display(options);
            return true;
        } catch(InvalidSettingsException e) {
            return false;
        }
    }
    
    public void update(SimOptions o) {
        if (readOptions() && (null != updater))
            updater.update(options);
    }
    
    public SimOptions getOptions() {
        if (!readOptions())
            throw new InvalidSettingsException();
        return(new SimOptions(options));
    }
    
    public SimOptions getOptions(SimOptions sto) {
        if (!readOptions())
            throw new InvalidSettingsException();
        SimOptions o = new SimOptions(sto);
        o.dt = options.dt;
        o.start = options.start;
        o.frame = options.frame;
        o.particleSeries = new ArrayList();
        for(int i = 0; i < options.particleSeries.size(); i++) {
            o.particleSeries.add(options.getps(i));
        }
        o.corpusMotion = new MotionList(options.corpusMotion);
        o.aIsthmusMotion = new MotionList(options.aIsthmusMotion);
        o.pIsthmusMotion = new MotionList(options.pIsthmusMotion);
        o.maxT = options.maxT;
        return(o);
    }
    
    /** 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 FormEditor.
     */
    private void initComponents() {//GEN-BEGIN:initComponents
        settingsTabbedPane = new javax.swing.JTabbedPane();
        allParticlesPanel = new javax.swing.JPanel();
        particleSeriesSettingsPanel1 = new ParticleSeriesSettingsPanel(this);
        particleSeriesSettingsPanel2 = new ParticleSeriesSettingsPanel(this);
        particleSeriesSettingsPanel3 = new ParticleSeriesSettingsPanel(this);
        allMotionsSettings = new javax.swing.JPanel();
        corpusMotionSettingsPanel = new MotionSettingsPanel(this);
        aIsthmusMotionSettingsPanel = new MotionSettingsPanel(this);
        pIsthmusMotionSettingsPanel = new MotionSettingsPanel(this);
        animationSettingsPanel = new AnimationSettingsPanel(this);
        snapShotSettingsPanel = new pharynx.SnapShotSettingsPanel();
        settingsGraphPanel = new pharynx.SettingsGraphPanel();
        
        setLayout(new javax.swing.BoxLayout(this, javax.swing.BoxLayout.X_AXIS));
        
        setName("");
        allParticlesPanel.setLayout(new javax.swing.BoxLayout(allParticlesPanel, javax.swing.BoxLayout.Y_AXIS));
        
        particleSeriesSettingsPanel1.setLayout(new java.awt.GridLayout(2, 8));
        
        particleSeriesSettingsPanel1.setBorder(new javax.swing.border.TitledBorder("Particle Series 1"));
        allParticlesPanel.add(particleSeriesSettingsPanel1);
        
        particleSeriesSettingsPanel2.setLayout(new java.awt.GridLayout(2, 8));
        
        particleSeriesSettingsPanel2.setBorder(new javax.swing.border.TitledBorder("Particle Series 2"));
        allParticlesPanel.add(particleSeriesSettingsPanel2);
        
        particleSeriesSettingsPanel3.setLayout(new java.awt.GridLayout(2, 8));
        
        particleSeriesSettingsPanel3.setBorder(new javax.swing.border.TitledBorder("Particle Series 3"));
        allParticlesPanel.add(particleSeriesSettingsPanel3);
        
        settingsTabbedPane.addTab("Particle Settings", allParticlesPanel);
        
        allMotionsSettings.setLayout(new javax.swing.BoxLayout(allMotionsSettings, javax.swing.BoxLayout.Y_AXIS));
        
        corpusMotionSettingsPanel.setLayout(new java.awt.GridLayout(1, 6));
        
        corpusMotionSettingsPanel.setBorder(new javax.swing.border.TitledBorder("Corpus Motions"));
        allMotionsSettings.add(corpusMotionSettingsPanel);
        
        aIsthmusMotionSettingsPanel.setLayout(new java.awt.GridLayout(1, 6));
        
        aIsthmusMotionSettingsPanel.setBorder(new javax.swing.border.TitledBorder("Anterior Isthmus Motions"));
        allMotionsSettings.add(aIsthmusMotionSettingsPanel);
        
        pIsthmusMotionSettingsPanel.setLayout(new java.awt.GridLayout(1, 6));
        
        pIsthmusMotionSettingsPanel.setBorder(new javax.swing.border.TitledBorder("Posterior Isthmus Motions"));
        allMotionsSettings.add(pIsthmusMotionSettingsPanel);
        
        animationSettingsPanel.setLayout(new java.awt.GridLayout(3, 3));
        
        animationSettingsPanel.setBorder(new javax.swing.border.TitledBorder("Animation Settings"));
        allMotionsSettings.add(animationSettingsPanel);
        
        snapShotSettingsPanel.setBorder(new javax.swing.border.TitledBorder("Snapshot Settings"));
        snapShotSettingsPanel.setPreferredSize(new java.awt.Dimension(226, 50));
        snapShotSettingsPanel.setMinimumSize(new java.awt.Dimension(161, 40));
        snapShotSettingsPanel.setFont(new java.awt.Font("Dialog", 0, 11));
        snapShotSettingsPanel.setMaximumSize(new java.awt.Dimension(2147483647, 50));
        allMotionsSettings.add(snapShotSettingsPanel);
        
        settingsTabbedPane.addTab("Motion Settings", allMotionsSettings);
        
        add(settingsTabbedPane);
        
        settingsGraphPanel.setBorder(new javax.swing.border.TitledBorder("Motion and Particle Settings"));
        settingsGraphPanel.setPreferredSize(new java.awt.Dimension(500, 400));
        add(settingsGraphPanel);
        
    }//GEN-END:initComponents


    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JTabbedPane settingsTabbedPane;
    private javax.swing.JPanel allParticlesPanel;
    private pharynx.ParticleSeriesSettingsPanel particleSeriesSettingsPanel1;
    private pharynx.ParticleSeriesSettingsPanel particleSeriesSettingsPanel2;
    private pharynx.ParticleSeriesSettingsPanel particleSeriesSettingsPanel3;
    private javax.swing.JPanel allMotionsSettings;
    private pharynx.MotionSettingsPanel corpusMotionSettingsPanel;
    private pharynx.MotionSettingsPanel aIsthmusMotionSettingsPanel;
    private pharynx.MotionSettingsPanel pIsthmusMotionSettingsPanel;
    private pharynx.AnimationSettingsPanel animationSettingsPanel;
    private pharynx.SnapShotSettingsPanel snapShotSettingsPanel;
    private pharynx.SettingsGraphPanel settingsGraphPanel;
    // End of variables declaration//GEN-END:variables

}