package sorters;

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

@SuppressWarnings("serial")
public class AnimatedSorting extends JFrame {
	private int numNums;
	private AnimatedSortPanel asp;
	private AnimationThread messenger;
	private JSlider slider;
	
	public AnimatedSorting() {
		setTitle("Animated Sorting");
		setSize(400,400);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		getContentPane().setLayout(new BorderLayout());
		
		asp = new AnimatedSortPanel();
		getContentPane().add(asp, BorderLayout.CENTER);
		
		JMenuBar bar = new JMenuBar();
		JMenu sorters = new JMenu("Sorters");
		addSorter("BubbleSorter", sorters, new BubbleSorter());
		addSorter("InsertionSorter", sorters, new InsertionSorter());
		//addSorter("MergeSorter", sorters, new MergeSorter());
		//addSorter("QuickSorter", sorters, new QuickSorter());
		//addSorter("HeapSorter", sorters, new HeapSorter());
		
		bar.add(sorters);
		setJMenuBar(bar);
		
		messenger = new AnimationThread(asp, 10);
		messenger.start();
		
		slider = new JSlider(50, 500);
		slider.addChangeListener(new ChangeNums());
		getContentPane().add(slider, BorderLayout.NORTH);
		numNums = slider.getValue();
		slider.setPaintLabels(true);
	}
	
	private class ChangeNums implements ChangeListener {

		@Override
		public void stateChanged(ChangeEvent e) {
			numNums = slider.getValue();
		}
		
	}
	
	private void addSorter(String name, JMenu menu, Sorter sorter) {
		JMenuItem item = new JMenuItem(name);
		item.addActionListener(new SortStarter(sorter));
		menu.add(item);
	}
	
	public static void main(String[] args) {
		new AnimatedSorting().setVisible(true);
	}
	
	private class SortStarter implements ActionListener {
		private Sorter sorter;
		
		public SortStarter(Sorter sorter) {
			this.sorter = sorter;
		}
		
		public void actionPerformed(ActionEvent e) {
			int[] nums = new int[numNums];
			for (int i = 0; i < nums.length; ++i) {
				nums[i] = i;
			}
			
			Sorter.scramble(nums);
			
			int[] animNums = new int[nums.length];
			for (int i = 0; i < nums.length; ++i) {
				animNums[i] = nums[i];
			}
			
			asp.reset(animNums);
			sorter.setMessenger(messenger);
			new SorterThread(sorter, nums).start();
		}
	}
}
