/*
 * MCMCPanel.java
 *
 * Copyright (c) 2002-2015 Alexei Drummond, Andrew Rambaut and Marc Suchard
 *
 * This file is part of BEAST.
 * See the NOTICE file distributed with this work for additional
 * information regarding copyright ownership and licensing.
 *
 * BEAST is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 *  BEAST is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with BEAST; if not, write to the
 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
 * Boston, MA  02110-1301  USA
 */

package dr.app.oldbeauti;

import dr.app.gui.components.WholeNumberField;
import jam.framework.Exportable;
import jam.panels.OptionsPanel;

import javax.swing.*;
import javax.swing.event.ChangeListener;
import javax.swing.event.ChangeEvent;
import java.awt.event.ActionEvent;

/**
 * @author			Andrew Rambaut
 * @author			Alexei Drummond
 * @version			$Id: MCMCPanel.java,v 1.16 2006/09/05 13:29:34 rambaut Exp $
 */
public class MCMCPanel extends OptionsPanel implements Exportable {

	/**
	 *
	 */
	private static final long serialVersionUID = -3710586474593827540L;
	WholeNumberField chainLengthField = new WholeNumberField(1, Integer.MAX_VALUE);
	WholeNumberField echoEveryField = new WholeNumberField(1, Integer.MAX_VALUE);
	WholeNumberField logEveryField = new WholeNumberField(1, Integer.MAX_VALUE);

	JCheckBox samplePriorCheckBox = new JCheckBox("Sample from prior only - create empty alignment");

	JTextField logFileNameField = new JTextField("untitled.log");
	JTextField treeFileNameField = new JTextField("untitled.trees");
    JCheckBox mapTreeLogCheck = new JCheckBox("Create tree file containing the MAP tree:");
    JTextField mapTreeFileNameField = new JTextField("untitled.MAP.tree");
    JCheckBox substTreeLogCheck = new JCheckBox("Create tree log file with branch length in substitutions:");
    JTextField substTreeFileNameField = new JTextField("untitled(subst).trees");

	BeautiFrame frame = null;

	public MCMCPanel(BeautiFrame parent) {

		super(12, 24);

		this.frame = parent;

		setOpaque(false);

		chainLengthField.setValue(100000);
		chainLengthField.setColumns(10);
		addComponentWithLabel("Length of chain:", chainLengthField);

		addSeparator();

		echoEveryField.setValue(1000);
		echoEveryField.setColumns(10);
		addComponentWithLabel("Echo state to screen every:", echoEveryField);

		logEveryField.setValue(100);
		logEveryField.setColumns(10);
		addComponentWithLabel("Log parameters every:", logEveryField);

		addSeparator();

		logFileNameField.setColumns(32);
		addComponentWithLabel("Log file name:", logFileNameField);
		treeFileNameField.setColumns(32);
		addComponentWithLabel("Trees file name:", treeFileNameField);

//        addComponent(mapTreeLogCheck);
//        mapTreeLogCheck.setOpaque(false);
//        mapTreeLogCheck.addActionListener(new java.awt.event.ActionListener() {
//            public void actionPerformed(ActionEvent e) {
//                mapTreeFileNameField.setEnabled(mapTreeLogCheck.isSelected());
//            }
//        });
//
//        mapTreeFileNameField.setColumns(32);
//        addComponentWithLabel("MAP tree file name:", mapTreeFileNameField);

        addComponent(substTreeLogCheck);
        substTreeLogCheck.setOpaque(false);
        substTreeLogCheck.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(ActionEvent e) {
                substTreeFileNameField.setEnabled(substTreeLogCheck.isSelected());
	            frame.mcmcChanged();
           }
        });

        substTreeFileNameField.setColumns(32);
        addComponentWithLabel("Substitutions trees file name:", substTreeFileNameField);

		java.awt.event.KeyListener listener = new java.awt.event.KeyAdapter() {
			public void keyTyped(java.awt.event.KeyEvent ev) {
				frame.mcmcChanged();
			}
		};

		addSeparator();

		addComponent(samplePriorCheckBox);
		samplePriorCheckBox.setOpaque(false);
		samplePriorCheckBox.addChangeListener(new ChangeListener() {
		    public void stateChanged(ChangeEvent changeEvent) {
			    frame.mcmcChanged();
		    }
		});

		chainLengthField.addKeyListener(listener);
		echoEveryField.addKeyListener(listener);
		logEveryField.addKeyListener(listener);
		logFileNameField.addKeyListener(listener);
		treeFileNameField.addKeyListener(listener);
        //mapTreeFileNameField.addKeyListener(listener);
        substTreeFileNameField.addKeyListener(listener);
	}

	public void setOptions(BeautiOptions options) {

		chainLengthField.setValue(options.chainLength);

		echoEveryField.setValue(options.echoEvery);
		logEveryField.setValue(options.logEvery);

		if (options.fileNameStem != null) {
            if (options.logFileName == null) {
			logFileNameField.setText(options.fileNameStem + ".log");
            } else {
                logFileNameField.setText(options.logFileName);
            }
            if (options.treeFileName == null) {
			    treeFileNameField.setText(options.fileNameStem + ".trees");
            } else {
                treeFileNameField.setText(options.treeFileName);
            }
//            if (options.mapTreeFileName == null) {
//			    mapTreeFileNameField.setText(options.fileNameStem + ".MAP.tree");
//            } else {
//                mapTreeFileNameField.setText(options.mapTreeFileName);
//            }
            if (options.substTreeFileName == null) {
			    substTreeFileNameField.setText(options.fileNameStem + "(subst).trees");
            } else {
                substTreeFileNameField.setText(options.substTreeFileName);
            }
			logFileNameField.setEnabled(true);
			treeFileNameField.setEnabled(true);

//            mapTreeLogCheck.setEnabled(true);
//            mapTreeLogCheck.setSelected(options.mapTreeLog);
//            mapTreeFileNameField.setEnabled(options.mapTreeLog);

            substTreeLogCheck.setEnabled(true);
            substTreeLogCheck.setSelected(options.substTreeLog);
            substTreeFileNameField.setEnabled(options.substTreeLog);
		} else {
			logFileNameField.setText("untitled");
			logFileNameField.setEnabled(false);
			treeFileNameField.setText("untitled");
			treeFileNameField.setEnabled(false);
//            mapTreeLogCheck.setEnabled(false);
//            mapTreeFileNameField.setEnabled(false);
//            mapTreeFileNameField.setText("untitled");
            substTreeLogCheck.setEnabled(false);
            substTreeFileNameField.setEnabled(false);
            substTreeFileNameField.setText("untitled");
		}

		samplePriorCheckBox.setSelected(options.samplePriorOnly);

		validate();
		repaint();
	}

	public void getOptions(BeautiOptions options) {
		options.chainLength = chainLengthField.getValue().intValue();

		options.echoEvery = echoEveryField.getValue().intValue();
		options.logEvery = logEveryField.getValue().intValue();

		options.logFileName = logFileNameField.getText();
		options.treeFileName = treeFileNameField.getText();

//        options.mapTreeLog = mapTreeLogCheck.isSelected();
//        options.mapTreeFileName = mapTreeFileNameField.getText();

        options.substTreeLog = substTreeLogCheck.isSelected();
        options.substTreeFileName = substTreeFileNameField.getText();

		options.samplePriorOnly = samplePriorCheckBox.isSelected();
	}

    public JComponent getExportableComponent() {
		return this;
	}

}
