/**
  * @author dwg
  */

public class Ping extends JPanel implements ActionListener
{
	private SwingWorker<Void, String> worker;
	private JTextArea output;
	private JTextField input;
	private JButton start;
	private JButton stop;

	public Ping() {
		super(new BorderLayout());
		initComponents();
		initGui();
	}

	private void initComponents() {
		worker = null;
		output = new JTextArea(15, 50);
		output.setEditable(false);
		input = new JTextField();
		start = new JButton("Ping");
		start.addActionListener(this);
		stop = new JButton("Stop");
		stop.setEnabled(false);
		stop.addActionListener(this);
	}

	private void initGui() {
		add(new JScrollPane(output), BorderLayout.CENTER);
		JPanel inputPanel = new JPanel(new BorderLayout());
		inputPanel.add(input, BorderLayout.CENTER);
		JPanel buttonPanel = new JPanel();
		buttonPanel.add(start);
		buttonPanel.add(stop);
		inputPanel.add(buttonPanel, BorderLayout.EAST);
		add(inputPanel, BorderLayout.NORTH);
	}

	public void actionPerformed(ActionEvent e) {
		if (start == e.getSource()) {
			handleStart();
		} else {
			handleStop();
		}
	}

	private SwingWorker<Void, String> createWorker(final String host) {
		return new SwingWorker<Void, String>() {
			@Override
			protected Void doInBackground() throws Exception {
				String[] cmd = {"ping", "-t", host};
				Process p = Runtime.getRuntime().exec(cmd);
				InputStream is = p.getInputStream();
				StringBuilder sb = new StringBuilder();
				int read = -1;
				while ((read = is.read()) != -1) {
					sb.append((char)read);
					if (read == '\n') {
						publish(sb.toString());
						sb.setLength(0);
					}
					if (isCancelled()) {
						break;
					}
				}
				return null;
			}

			@Override
			protected void process(List<String> chunks) {
				for (String s : chunks) {
					if (s.indexOf("Reply") != -1) {
						Toolkit.getDefaultToolkit().beep();
					}
					output.append(s);
				}
			}

			@Override
			protected void done() {
				start.setEnabled(true);
				stop.setEnabled(false);
			}
		};
	}

	private void handleStart() {
		if (worker != null && !worker.isDone()) {
			worker.cancel(false);
		}
		output.setText("");
		start.setEnabled(false);
		stop.setEnabled(true);
		worker = createWorker(input.getText());
		worker.execute();
	}

	private void handleStop() {
		worker.cancel(false);
		start.setEnabled(true);
		stop.setEnabled(false);
	}

	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				JFrame frame = new JFrame("Ping");
				frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
				frame.setContentPane(new Ping());
				frame.pack();
				frame.setVisible(true);
			}
		});
	}
}