import javax.swing.JButton;
import javax.swing.SwingUtilities;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.BorderFactory;
import javax.swing.Timer;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics; 
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseAdapter;

public class Ball {
    
    public static final int WINDOWSIZE_X =800;
    public static final int WINDOWSIZE_Y =600;

	public static void main(String[] args) {

        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI(); 
            }
        });
    }

    private static void createAndShowGUI() {
        System.out.println("Created GUI on EDT? "+
        SwingUtilities.isEventDispatchThread());
        JFrame f = new JFrame("Swing Paint Demo");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);      
        f.add(new MyPanel());
        f.setSize(WINDOWSIZE_X,WINDOWSIZE_Y);
        f.setVisible(true);
       
    } 

}

class MyPanel extends JPanel{

    /**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	RedSquare redSquare = new RedSquare();

	Timer timer;
	int s=1;
	int isMoving=1;
	
    public MyPanel() {
    	
        //Timer
    	timer = new Timer(s, new ActionListener(){

			public void actionPerformed(ActionEvent arg0) {
				if(redSquare.getX()<0 || redSquare.getX() > Ball.WINDOWSIZE_X-2*redSquare.getWidth())
					redSquare.speedX = -redSquare.speedX;
				if(redSquare.getY()<0 || redSquare.getY() > Ball.WINDOWSIZE_Y-2*redSquare.getHeight())
					redSquare.speedY = -redSquare.speedY;
				moveSquare(redSquare.getX()+redSquare.speedX,
						redSquare.getY()+redSquare.speedY);
			}
    		
    	});
    	
    	timer.setInitialDelay(1);
    	timer.start(); 

        setBorder(BorderFactory.createLineBorder(Color.black));

        addMouseListener(new MouseAdapter(){
            public void mousePressed(MouseEvent e){
               // moveSquare(e.getX(),e.getY());
                if  (isMoving==0){        	
                    
                               
                	moveSquare(e.getX(),e.getY());
                	redSquare.speedX=redSquare.prevSpeedY;
                    redSquare.speedY=redSquare.prevSpeedX;
                	isMoving=1;
                }
                else {
                    redSquare.prevSpeedX=redSquare.speedX;
                    redSquare.prevSpeedY=redSquare.speedY;
                	
                    redSquare.speedX=0;
                    redSquare.speedY=0;
                    
                    isMoving=0;
                }  	
            }
        });

  
    }

    private void moveSquare(int x, int y){

        // Current square state, stored as final variables 
        // to avoid repeat invocations of the same methods.
        final int CURR_X = redSquare.getX();
        final int CURR_Y = redSquare.getY();
        final int CURR_W = redSquare.getWidth();
        final int CURR_H = redSquare.getHeight();
        final int OFFSET = 1;
       
 
        if ((CURR_X!=x) || (CURR_Y!=y)) {

            // The square is moving, repaint background 
            // over the old square location. 
            repaint(CURR_X,CURR_Y,CURR_W+OFFSET,CURR_H+OFFSET);

            // Update coordinates.
            redSquare.setX(x);
            redSquare.setY(y);

            // Repaint the square at the new location.
            repaint(redSquare.getX(), redSquare.getY(), 
                    redSquare.getWidth()+OFFSET, 
                    redSquare.getHeight()+OFFSET);
        }
        
        
    }

    
 
    public Dimension getPreferredSize() {
        return new Dimension(250,200);
    }
    
    public void paintComponent(Graphics g) {
        super.paintComponent(g);       
        g.drawString("This is my custom Panel!",10,20);
        
        redSquare.paintSquare(g);
    }  
}

// square class

class RedSquare{

    private int xPos = 50;
    private int yPos = 50;
    private int width = 20;
    private int height = 20;
    
    public int speedX = 1;
    public int speedY = 2;
    
    public int prevSpeedX=0;
    public int prevSpeedY=0;

    public void setX(int xPos){ 
        this.xPos = xPos;
    }

    public int getX(){
        return xPos;
    }

    public void setY(int yPos){
        this.yPos = yPos;
    }

    public int getY(){
        return yPos;
    }

    public int getWidth(){
        return width;
    } 

    public int getHeight(){
        return height;
    }

    public void paintSquare(Graphics g){
        g.setColor(Color.RED);
        g.fillRect(xPos,yPos,width,height);
        g.setColor(Color.BLACK);
        g.drawRect(xPos,yPos,width,height);  
    }
}