import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Frame extends JFrame {

	private static final long serialVersionUID = 1L;

	private JPanel container;
	private JPanel ratePanel, delayPanel, south, numberPanel;
	private JButton button1, button2;
	private JTextField delayText, rateText, numberText;
	private JLabel delayLabel, rateLabel, numberLabel;
	private boolean autoclick = false;
	private Thread t;

	public Frame() {

		this.setTitle("Autoclick");
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setSize(250, 320);
		this.setLocationRelativeTo(null);
		this.setResizable(false);
		this.setAlwaysOnTop(true);

		initComposant();

		this.setContentPane(container);
		this.setVisible(true);
	}

	private void initComposant() {
		// Delay
		delayPanel = new JPanel();
		delayPanel.setBorder(BorderFactory.createTitledBorder("Delay"));
		delayPanel.setPreferredSize(new Dimension(150, 75));

		delayText = new JTextField();
		delayText.setPreferredSize(new Dimension(50, 25));
		delayLabel = new JLabel("Delay in millisecodns");
		delayPanel.add(delayText);
		delayPanel.add(delayLabel);

		// Rate
		ratePanel = new JPanel();
		ratePanel.setPreferredSize(new Dimension(150, 75));
		ratePanel.setBorder(BorderFactory.createTitledBorder("Rate"));
		rateText = new JTextField();
		rateText.setPreferredSize(new Dimension(50, 25));
		rateLabel = new JLabel("Rate in milliseconds");
		ratePanel.add(rateLabel);
		ratePanel.add(rateText);

		// Number
		numberPanel = new JPanel();
		numberPanel.setPreferredSize(new Dimension(150, 75));
		numberPanel.setBorder(BorderFactory.createTitledBorder("Number"));
		numberText = new JTextField();
		numberText.setPreferredSize(new Dimension(50, 25));
		numberLabel = new JLabel("Number of clicks");
		numberPanel.add(numberLabel);
		numberPanel.add(numberText);

		// Creation du JPanel south
		south = new JPanel();

		// Création du bouton1 et bouton2 et ajout au JPanel south
		this.button1 = new JButton("GO!");
		this.button2 = new JButton("STOP!");

		this.button1.setEnabled(true);
		this.button2.setEnabled(false);

		this.button1.addActionListener(new Button1Listener());
		this.button2.addActionListener(new Button2Listener());

		south.add(this.button1);
		south.add(this.button2);

		container = new JPanel();
		container.add(delayPanel);
		container.add(ratePanel);
		container.add(numberPanel);
		container.add(south, BorderLayout.SOUTH);

	}

	public void go() {

		long rate = Long.parseLong(rateText.getText());
		System.out.println(rate);
		long delay = Long.parseLong(delayText.getText());
		System.out.println(delay);
		int number = Integer.parseInt(numberText.getText());
		System.out.println(number);

		try {
			Thread.sleep(delay);
		} catch (InterruptedException e) {
		}

		for (int i = 0; i < number && autoclick; i++) {
			try {
				Robot robot = new Robot();

				try {
					Thread.sleep(rate);
					robot.mousePress(InputEvent.BUTTON1_MASK);
					robot.mouseRelease(InputEvent.BUTTON1_MASK);

				} catch (InterruptedException ex) {

				}

			} catch (AWTException e) {

			}
		}
		
		button2.doClick();
	}

	// Class qui écoute le 1er bouton
	class Button1Listener implements ActionListener {
		public void actionPerformed(ActionEvent arg0) {
			autoclick = true;
			t = new Thread(new AutoClick());
			t.start();
			button1.setEnabled(false);
			button2.setEnabled(true);
		}

	}

	// Class qui écoute le 2nd bouton
	class Button2Listener implements ActionListener {
		public void actionPerformed(ActionEvent arg0) {
			autoclick = false;
			button1.setEnabled(true);
			button2.setEnabled(false);
		}

	}

	class AutoClick implements Runnable {
		public void run() {
			go();
		}
	}

	public static void main(String[] args) {
		new Frame();
	}

}
