package edu.calpoly.csc480.Entomo.Seer;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

public class ToolbarView extends JToolBar
{
	public ToolbarView() {
      setFloatable(false);
	}
	
	public void setOwner(SeerView view) {
		this.view = view;
	}
	
	public void setDocument(Seer seer) {
		this.seer = seer;

		makeToolbarButtons();
		makeToolbarSlider();
		makeToolbar();
	}

	public void updateComponents() {
		flipButton.setText(seer.isRunning() ? "Pause" : "Play");

		flipButton.setEnabled(seer.isRunnable());
		stepButton.setEnabled(seer.isRunnable());// && !seer.isRunning());
		stopButton.setEnabled(seer.isStarted());
	}

	protected Seer seer;
	protected SeerView view;
	
	protected JButton flipButton, stepButton, stopButton;
	protected JPanel buttonPanel;
	
	protected JLabel delayLabel;
	protected JSlider delaySlider;
	protected JPanel delayPanel;

	protected void makeToolbarButtons() {
		final int insets = 4;
		
		Dimension buttonSize;
		
		buttonPanel = new JPanel(true);
		buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.X_AXIS));
		
		flipButton = new JButton("Pause");
		stepButton = new JButton("Step");
		stopButton = new JButton("Stop");

		flipButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent event) {seer.flip();}
		});
		
		stepButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent event) {seer.step();}
		});

		stopButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent event) {seer.stop();}
		});

		buttonPanel.add(flipButton);
      buttonPanel.add(stepButton);
      buttonPanel.add(stopButton);
	}
	
	protected void makeToolbarSlider() {
		final int xInset = 4, yInset = 2;
		final int sliderTicksPerDelay = 100;
		final int majorTickSpacing = 5;
		
		int minimumValue, maximumValue, currentValue;
		GridBagConstraints curb = new GridBagConstraints();
		
		delayPanel = new JPanel(new GridBagLayout(), true);
      delayPanel.setBorder(BorderFactory.createCompoundBorder(
		 BorderFactory.createLoweredBevelBorder(),
		 BorderFactory.createEmptyBorder(yInset, xInset, yInset, xInset)
		));
		
		minimumValue = 0;
		maximumValue = seer.getMaximumDelay() / sliderTicksPerDelay;
		currentValue = seer.getDelay() / sliderTicksPerDelay;
		
		delayLabel = new JLabel("Delay: ", JLabel.RIGHT);
      delayLabel.setVerticalAlignment(JLabel.CENTER);		

		delaySlider = new JSlider(minimumValue, maximumValue, currentValue);
		delaySlider.setMajorTickSpacing(majorTickSpacing);
		delaySlider.setMinorTickSpacing(1);
		delaySlider.setPaintTicks(true);
      delaySlider.setPaintTrack(true);

      delaySlider.addChangeListener(new ChangeListener() {
			final public void stateChanged(ChangeEvent event) {
				seer.setDelay(delaySlider.getValue() * sliderTicksPerDelay);
			}
		});
		
		delayPanel.add(delayLabel, curb);

		curb.anchor = GridBagConstraints.SOUTH;
		curb.fill = GridBagConstraints.HORIZONTAL;
      curb.gridwidth = GridBagConstraints.REMAINDER;
		curb.gridheight = 1;
      curb.weightx = 1.0;
		curb.weighty = 0.0;
		delayPanel.add(delaySlider, curb);
	}
	
	protected void makeToolbar() {
		GridBagConstraints curb = new GridBagConstraints();

      curb.anchor = GridBagConstraints.SOUTH;
		curb.fill = GridBagConstraints.NONE;
		curb.gridwidth  = 1;
		curb.gridheight = 1;
		curb.weightx = 0.0;
		curb.weighty = 0.0;
      add(buttonPanel, curb);
		
		addSeparator();
		addSeparator();
		
      curb.anchor = GridBagConstraints.SOUTH;
		curb.fill = GridBagConstraints.HORIZONTAL;
      curb.gridwidth = GridBagConstraints.REMAINDER;
		curb.gridheight = 1;
      curb.weightx = 1.0;
		curb.weighty = 0.0;
      add(delayPanel, curb);
	}
}