/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */


import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Point;
import java.awt.Robot;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.SwingUtilities;

/**
 *
 * @author akulyakh
 */
public class ShiftTest implements KeyListener {

    private int delay = 500;
    private int keyDelay = 50;
    private Button button;
    private volatile boolean keyPressed;

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws Exception {
        new ShiftTest().doTest();
    }
    private Robot robot;

    public void doTest() throws Exception {

        try {
            robot = new Robot();
        } catch (Exception x) {
            x.printStackTrace();
        }

        SwingUtilities.invokeAndWait(new Runnable() {
            public void run() {
                Frame frame = new Frame();
                frame.setTitle("Extended Modifiers Test");
                frame.setLayout(new FlowLayout());
                button = new Button("Robot");
                button.addKeyListener(ShiftTest.this);
                frame.add(button);
                frame.pack();
                frame.setVisible(true);
            }
        });
        
        doRobot();
        
        System.exit(0);

    }

    @Override
    public void keyTyped(KeyEvent ke) {
    }

    @Override
    public synchronized  void keyPressed(KeyEvent ke) {
        log("=>keyPressed " + ke.getKeyCode());
        keyPressed = true;
        notifyAll();
    }

    @Override
    public void keyReleased(KeyEvent ke) {
    }

    private void log(String s) {
        System.out.println(s);
    }

    private void waitKey(int keyCode) {
        if(!keyPressed) {
            try {
                log("Waiting for key " + keyCode);
                synchronized(this) {
                    wait(10000);
                }
            } catch(Exception x) {
                x.printStackTrace();
            }
        }
        if(keyPressed) {
            log("Key " + keyCode + " was pressed");
        } else {
            log("Key " + keyCode + " was not pressed");
        }
    }

    private void doRobot() {
        
        keyPressed = false;
        
        Point p = button.getLocationOnScreen();
        robot.mouseMove(p.x + button.getWidth()/2, p.y + button.getHeight()/2);

        robot.keyPress(KeyEvent.VK_SHIFT);
        robot.delay(keyDelay);
        
        waitKey(KeyEvent.VK_SHIFT);

        keyPressed = false;

        robot.keyPress(KeyEvent.VK_A);
        robot.delay(keyDelay);

        waitKey(KeyEvent.VK_A);
        
        robot.keyRelease(KeyEvent.VK_A);

        log("Done");
    }

}
