/** 
 * GenSketchFrame.java
 *
 * Title:			GenSketch
 * Description:		This is a Generative Sketch Application
 * @author			
 * @version			
 */

/*
To Do:
Use javax.swing.colorchooser for color picker (JColorChooser)
Use javax.swing.filechooser for file save, open etc.. (JFileChooser)
*/

import java.util.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import javax.swing.*;

public class GenSketchFrame extends javax.swing.JFrame {
	
        // Graphics Objects
	private BasicStroke theStroke = new BasicStroke(9);
	
	// Graphic state Variables
	private int windowY;
	private int windowX;
	private int mouseX = 0;
	private int mouseY = 0;
	private boolean coordSet = false;
		
        // UI Objects
	javax.swing.JPanel drawingPanel = new javax.swing.JPanel();
        
        javax.swing.JPanel topLeftPanel = new javax.swing.JPanel();
        javax.swing.JPanel topMiddlePanel = new javax.swing.JPanel();
        javax.swing.JPanel topRightPanel = new javax.swing.JPanel();

        javax.swing.JPanel bottomLeftPanel = new javax.swing.JPanel();
        javax.swing.JPanel bottomMiddlePanel = new javax.swing.JPanel();
        javax.swing.JPanel bottomRightPanel = new javax.swing.JPanel();

        javax.swing.JPanel middleLeftPanel = new javax.swing.JPanel();
        javax.swing.JPanel middleRightPanel = new javax.swing.JPanel();

	// Default Constructor
	public GenSketchFrame() {
	}

	public void initComponents() throws Exception {
		// the following code sets the frame's initial state
		setSize(new java.awt.Dimension(600, 600));
		drawingPanel.setVisible(true);
		drawingPanel.setLayout(null);
		setLocation(new java.awt.Point(0, 0));
		setResizable(true);
		setBackground(java.awt.Color.lightGray);
		getContentPane().setLayout(new GridLayout(3,3));
		setTitle("GenSketch");

		// Add the components
                getContentPane().add(topLeftPanel);
                getContentPane().add(topMiddlePanel);
                getContentPane().add(topRightPanel);
                
                getContentPane().add(middleLeftPanel);
                getContentPane().add(drawingPanel);
                getContentPane().add(middleRightPanel);

                getContentPane().add(bottomLeftPanel);
                getContentPane().add(bottomMiddlePanel);
                getContentPane().add(bottomRightPanel);

		
		// UI event handling
		// Mouse Actions
		drawingPanel.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
			public void mouseMoved(java.awt.event.MouseEvent e) {
				unSetCoords();
			}
			public void mouseDragged(java.awt.event.MouseEvent e) {
			// Main drawing method

		   		if (isCoordsSet())
		   		{
                                        
					Graphics2D graDraw = (Graphics2D) drawingPanel.getGraphics();
                                        doDrawing(graDraw,e);
     					Graphics2D gra2Draw = (Graphics2D) topLeftPanel.getGraphics();
                                        doDrawing(gra2Draw,e);
					Graphics2D gra3Draw = (Graphics2D) topMiddlePanel.getGraphics();
                                        doDrawing(gra3Draw,e);
					Graphics2D gra4Draw = (Graphics2D) middleRightPanel.getGraphics();
                                        doDrawing(gra4Draw,e);
					Graphics2D gra5Draw = (Graphics2D) middleLeftPanel.getGraphics();
                                        doDrawing(gra5Draw,e);
					Graphics2D gra6Draw = (Graphics2D) bottomLeftPanel.getGraphics();
                                        doDrawing(gra6Draw,e);
					Graphics2D gra7Draw = (Graphics2D) bottomMiddlePanel.getGraphics();
                                        doDrawing(gra7Draw,e);
					Graphics2D gra8Draw = (Graphics2D) bottomRightPanel.getGraphics();
                                        doDrawing(gra8Draw,e);
					Graphics2D gra9Draw = (Graphics2D) topRightPanel.getGraphics();
                                        doDrawing(gra9Draw,e);  
                                        
                                                                                                                                                                
				} 
				setCoords(e.getX(), e.getY());			
			}
		});
		drawingPanel.addMouseListener(new java.awt.event.MouseAdapter() {
			public void mousePressed(java.awt.event.MouseEvent e) {
                                
                                int ranX = (int) (Math.random() * drawingPanel.getSize().width);
                                int ranY = (int) (Math.random() * drawingPanel.getSize().height);
				setCoords(ranX, ranY);
					Graphics2D graDraw = (Graphics2D) drawingPanel.getGraphics();
                                        doDrawing(graDraw,e);
     					Graphics2D gra2Draw = (Graphics2D) topLeftPanel.getGraphics();
                                        doDrawing(gra2Draw,e);
					Graphics2D gra3Draw = (Graphics2D) topMiddlePanel.getGraphics();
                                        doDrawing(gra3Draw,e);
					Graphics2D gra4Draw = (Graphics2D) middleRightPanel.getGraphics();
                                        doDrawing(gra4Draw,e);
					Graphics2D gra5Draw = (Graphics2D) middleLeftPanel.getGraphics();
                                        doDrawing(gra5Draw,e);
					Graphics2D gra6Draw = (Graphics2D) bottomLeftPanel.getGraphics();
                                        doDrawing(gra6Draw,e);
					Graphics2D gra7Draw = (Graphics2D) bottomMiddlePanel.getGraphics();
                                        doDrawing(gra7Draw,e);
					Graphics2D gra8Draw = (Graphics2D) bottomRightPanel.getGraphics();
                                        doDrawing(gra8Draw,e);
					Graphics2D gra9Draw = (Graphics2D) topRightPanel.getGraphics();
                                        doDrawing(gra9Draw,e);                                                               
                        }
		});
   	}
   	
	private void doDrawing(Graphics2D graDraw, MouseEvent e)
        {
            graDraw.setColor(Color.black);
            graDraw.setStroke(theStroke);
            graDraw.drawLine(getXPoint(), getYPoint(), e.getX(), e.getY());
            graDraw.setColor(Color.blue);
            graDraw.drawLine(drawingPanel.getSize().width - getXPoint(), drawingPanel.getSize().height - getYPoint(), drawingPanel.getSize().width - e.getX(), drawingPanel.getSize().height - e.getY());
            graDraw.setColor(Color.black);
            graDraw.drawLine(getXPoint(), drawingPanel.getSize().height - getYPoint(), e.getX(), drawingPanel.getSize().height - e.getY());
            graDraw.setColor(Color.blue);
            graDraw.drawLine(drawingPanel.getSize().width - getXPoint(), getYPoint(), drawingPanel.getSize().width - e.getX(), e.getY());
        }
        
        
	// Methods for setting and unsetting the current mouse points
	private int getXPoint() 
	{
		return mouseX;
	}
	
	private int getYPoint()
	{
		return mouseY;
	}
	
	private void setCoords(int x, int y)
	{
		mouseX = x;
		mouseY = y;
		coordSet = true;
	}
	
	private void unSetCoords()
	{
		coordSet = false;
	}
	
	private boolean isCoordsSet()
	{
		return coordSet;
	}
	
	// Close the program when the close box is clicked
	void thisWindowClosing(java.awt.event.WindowEvent e) {
		// Normal window closing stuff
		setVisible(false);
		dispose();
		System.exit(1);  // Should this be 0 or 1
	}                                                                                                                                                                                                                                             }