Proyecto_1_2.java_



//	_________________________________________________________________________________
//	Se crea una ventana con menUs y nos permite dibujar mAximo 3 lIneas y 3 circulos
//	---------------------------------------------------------------------------------

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

public class Proyecto_1 extends JFrame
{
	JMenu MenuArchivo, MenuGrafico, MenuEdicion;
	JMenuItem ArchivoGuardar, ArchivoSalir, GraficoLinea, GraficoCirculo, EdicionLimpiar;
	Grafico G = new Grafico();
	
	final int NADA = 0, LINEA = 1, CIRCULO = 2;
	int X[] = new int[2], Y[] = new int[2];
	boolean OK = false;		// (OK) Para diferenciar el primer punto del segundo
	int Primitiva = NADA;

	public static void main(String R[]) { new Proyecto_1(); }

	public Proyecto_1()
	{
		this.getContentPane().setLayout(null);		// Contenedor nulo
		this.setTitle("Editor Grafico 1.0");		// Titulo de la ventana
		this.setResizable(true);			// Si es redimensionable
		this.setLocation(100, 100);			// Posicion
		this.setSize(new Dimension(600, 450));		// Dimensiones
		this.setBackground(Color.green);
		this.add(G); G.setBounds(0, 0, 600, 450);

		JMenuBar BarraMenu = new JMenuBar();		// Barra de menU
		BarraMenu.setBackground(Color.green);
		BarraMenu.setForeground(Color.yellow);

			MenuArchivo = InsertaMenu("Archivo");
			MenuArchivo.setMnemonic(KeyEvent.VK_A);		// Se accesa con Alt-A
			InsertaItem(MenuArchivo, ArchivoGuardar, "guardaR", KeyEvent.VK_R);	//Alt-R
			InsertaItem(MenuArchivo, ArchivoSalir, "Salir", KeyEvent.VK_S);	//Alt-S

			MenuGrafico = InsertaMenu("Grafico");
			MenuGrafico.setMnemonic(KeyEvent.VK_G);			// Se accesa con Alt-G
			InsertaItem(MenuGrafico, GraficoLinea, "Linea", KeyEvent.VK_L);		// Alt-L
			InsertaItem(MenuGrafico, GraficoCirculo, "Circulo", KeyEvent.VK_C);	// Alt-C

			MenuEdicion = InsertaMenu("Edicion");
			MenuEdicion.setMnemonic(KeyEvent.VK_E);			// Se accesa con Alt-E
			InsertaItem(MenuEdicion, EdicionLimpiar, "Limpiar", KeyEvent.VK_I);	// Alt-L
	
			BarraMenu.add(MenuArchivo);
			BarraMenu.add(MenuGrafico);
			BarraMenu.add(MenuEdicion);
		setJMenuBar(BarraMenu);
		G.addMouseListener(new EventoRaton());
		this.setVisible(true);
	}

	JMenu InsertaMenu(String CAD) { return new JMenu(CAD); }

	void InsertaItem(JMenu MENU, JMenuItem ITEM, String CAD, int KEY_EVENT)
	{
		ITEM = new JMenuItem(CAD);
		ITEM.setMnemonic(KEY_EVENT);
		ITEM.setBackground(Color.green);
		ITEM.setForeground(Color.black);
		MENU.add(ITEM);
		ITEM.addActionListener(new Evento_Opciones());
	}

	protected void processWindowEvent(WindowEvent e)
	{ if (e.getID() == WindowEvent.WINDOW_CLOSING) System.exit(0); }

	class Evento_Opciones implements ActionListener
	{
		public void actionPerformed(ActionEvent e)
		{
			if (e.getActionCommand().equals("Salir")) System.exit(0);
			if (e.getActionCommand().equals("Guardar")) { }
			if (e.getActionCommand().equals("Linea")) { Primitiva = LINEA; }
			if (e.getActionCommand().equals("Circulo")) { Primitiva = CIRCULO; }
			if (e.getActionCommand().equals("Limpiar")) { G.Inicializa_Vectores( ); }
		}
	}
	
	class EventoRaton implements MouseListener
	{
		// Estos mEtodos no nos interesan por ahora. Sin embargo hay que ponerlos
		// al tratarse de una interfaz
		public void mouseEntered(MouseEvent e) {}
		public void mouseExited(MouseEvent e) {}
		public void mousePressed(MouseEvent e) {}
		public void mouseReleased(MouseEvent e) {}
		// Se crea el mEtodo que si nos interesa trabajar
		public void mouseClicked(MouseEvent e)
		{
			String boton = "";
			if ( !OK ) { X[0] = e.getX(); Y[0] = e.getY(); OK = true; }
			else { X[1] = e.getX(); Y[1] = e.getY(); OK = false; }
			
			switch (e.getButton())
			{
				// boton = "izquierdo";
				case MouseEvent.BUTTON1: if ( !OK) G.Dibuja(X, Y, Primitiva); break;
				case MouseEvent.BUTTON2: break;		// boton = "central";
				case MouseEvent.BUTTON3: break;		// boton = "derecho";
			}
		}
	}
}

class Grafico extends Canvas
{
	final int NADA = 0, LINEA = 1, CIRCULO = 2, Limite = 3;
        int X[] = new int[2], Y[] = new int[2], Primitiva = 1, N_Lineas = 0, N_Circulos = 0;
	Linea V_Linea[] = new Linea[3];
	Circulo V_Circulo[] = new Circulo[3];
	boolean Limpiar = false;

	public Grafico()
	{
		setBackground(Color.red);		// Color del fondo
		setForeground(Color.yellow);		// Color de los trazos
		Inicializa_Vectores( );
	}

	void Dibuja(int X[], int Y[], int Primitiva)
	{
		switch ( Primitiva )
		{
			case LINEA:
				if ( N_Lineas < Limite )
				{
					V_Linea[N_Lineas] = new Linea( X[0], Y[0], X[1], Y[1] );
					N_Lineas++;
				}
				break;
			case CIRCULO:
				if ( N_Circulos < Limite )
				{
					V_Circulo[N_Circulos] = new Circulo( X[0], Y[0], X[1], Y[1] );
					N_Circulos++;
				}
				break;
		}
		repaint();
	}

	public void paint(Graphics A)
	{
		int NL = 0, NC = 0;

		if ( !Limpiar )
		{
			for ( NL = 0; NL < N_Lineas; NL++)
				A.drawLine( V_Linea[NL].X1, V_Linea[NL].Y1, V_Linea[NL].X2, V_Linea[NL].Y2 );
			for ( NC = 0; NC < N_Circulos; NC++)
				A.drawOval( V_Circulo[NC].X, V_Circulo[NC].Y, V_Circulo[NC].Diametro, V_Circulo[NC].Diametro );
		}
		else Limpiar = false;
	}

	void Inicializa_Vectores( )
	{
		N_Lineas = 0; N_Circulos = 0;
		Limpiar = true;
		repaint();
	}
}

class Linea
{
	int X1=0, Y1=0, X2=0, Y2=0;

	public Linea() { }		// Se quedan los datos en ceros
	public Linea(int X1, int Y1, int X2, int Y2)
	{
		this.X1 = X1; this.Y1 = Y1;
		this.X2 = X2; this.Y2 = Y2;
	}
}

class Circulo
{
	int X = 0, Y = 0, Radio = 0, Diametro = 0;

	public Circulo() {}		// Se quedan los datos en ceros
	public Circulo(int X1, int Y1, int X2, int Y2)
	{
		Radio = (int) Math.hypot ( (double)(X2 - X1), (double)(Y2 - Y1) );
		X = X1 - Radio;
		Y = Y1 - Radio;
		Diametro = 2 * Radio;
	}
}