//Programa Gerador de código destinado a cumprir os requisitos da
//disciplina Laboratorio VI
//Produzido por Eduardo Pasquotto Orsolini


//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-//
							//Imports
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-//
			
			
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.io.*;

//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-//
						//Class Dados
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-//

class Dado implements Serializable
{	 
	 protected String nome;
	 protected String organizacao;
	 protected String email;	 
	 protected String observacao;
	 
	 Dado()
	 {
	 	nome ="";
	 	organizacao ="";
	 	email ="";
	 	observacao="";
	 }
	 
	 public void setNome(String nome)
	 {
	 	this.nome = nome;
	 }
	  	 
	 public String getNome()
	 {
	 	return nome;
	 }

	 public void setOrganizacao(String organizacao)
	 {
	 	this.organizacao = organizacao;
	 }
	  	 
	 public String getOrganizacao()
	 {
	 	return organizacao;
	 }

	 public void setEmail(String email)
	 {
	 	this.email = email;
	 }
	  	 
	 public String getEmail()
	 {
	 	return email;
	 }

	 public void setObservacao(String observacao)
	 {
	 	this.observacao = observacao;
	 }
	  	 
	 public String getObservacao()
	 {
	 	return observacao;
	 }
	
}




//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-//
						//Class Classe
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-//


class Classe implements Serializable
{
	 String identificador;
	 String tipo;
	 String visuClasse;	 
	 Vector atributos;
	 Vector metodos;


	Classe()
	{
		identificador = "";
		tipo = "";
		visuClasse = "";
		atributos = new Vector();
		metodos = new Vector();
	}//construtora

	public void setIdentificador(String identificador)
	{
		this.identificador = identificador;
	}

	public String getIdentificador()
	{
		return identificador;
	}

	public void setAtributos(Vector atributos)
	{
		this.atributos = atributos;
	}

	public Vector getAtributos()
	{
		return atributos;
	}
	
	public void setTipos(String tipo)
	{
		this.tipo = tipo;
	}
	
	public String getTipos()
	{
		return tipo;
	}
	
	public void setVisualidade(String visuClasse)
	{
		this.visuClasse = visuClasse;
	}
	
	public String getVisualidade()
	{
		return visuClasse;
	}

	public void setMetodos(Vector metodos)
	{
		this.metodos = metodos;
	}

	public Vector getMetodos()
	{
		return metodos;
	}
}//class Classe


//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-//
					//Class Metodo
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-//

class Metodo
{
	protected String visibilidade;
	protected String tipo;
	protected String modificador;
	protected String identificador;
	protected Vector parametros;

	Metodo()
	{
		visibilidade = "";
		tipo = "";
		modificador = "";
		identificador = "";
		parametros = new Vector();
	}

	Metodo(String visibilidade, String tipo, String modificador, String identificador, Vector parametros)
	{
		this.visibilidade = visibilidade;
		this.tipo = tipo;
		this.modificador = modificador;
		this.identificador = identificador;
		this.parametros = parametros;
	}

	public void setVisibilidade(String visibilidade)
	{
		this.visibilidade = visibilidade;
	}

	public String getVisibilidade()
	{
		return visibilidade;
	}

	public void setTipo(String tipo)
	{
		this.tipo = tipo;
	}

	public String getTipo()
	{
		return tipo;
	}

	public void setModificador(String modificador)
	{
		this.modificador = modificador;
	}

	public String getModificador()
	{
		return modificador;
	}

	public void setIdentificador(String identificador)
	{
		this.identificador = identificador;
	}

	public String getIdentificador()
	{
		return identificador;
	}

	public void setParametros(Vector parametros)
	{
		this.parametros = parametros;
	}

	public Vector getParametros()
	{
		return parametros;
	}
}


//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-//
						//class Atributo
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-//
						

class Atributo
{
	protected String visibilidade;
	protected String tipo;
	protected String modificador;
	protected String identificador;
	protected String valorInicial;

	Atributo()
	{
		visibilidade = "";
		tipo = "";
		modificador = "";
		identificador = "";
		valorInicial = "";
	}

	Atributo(String visibilidade, String tipo, String modificador, String identificador, String valorInicial)
	{
		this.visibilidade = visibilidade;
		this.tipo = tipo;
		this.modificador = modificador;
		this.identificador = identificador;
		this.valorInicial = valorInicial;
	}

	public void setVisibilidade(String visibilidade)
	{
		this.visibilidade = visibilidade;
	}

	public String getVisibilidade()
	{
		return visibilidade;
	}

	public void setTipo(String tipo)
	{
		this.tipo = tipo;
	}

	public String getTipo()
	{
		return tipo;
	}

	public void setModificador(String modificador)
	{
		this.modificador = modificador;
	}

	public String getModificador()
	{
		return modificador;
	}

	public void setIdentificador(String identificador)
	{
		this.identificador = identificador;
	}

	public String getIdentificador()
	{
		return identificador;
	}

	public void setValorInicial(String valorInicial)
	{
		this.valorInicial = valorInicial;
	}

	public String getValorInicial()
	{
		return valorInicial;
	}
}



//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-//
						//Class Gerador
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-//


public class Gerador extends Frame implements ActionListener
{
	TextArea ta = new TextArea(30, 30);
	Vector classes, relacionamentos, dados;

	//menus
	MenuBar mbar;
	Menu mArquivo, mClasse;
	
	
	Gerador()
	{
	  Toolkit tk = Toolkit.getDefaultToolkit();
	  Dimension d = tk.getScreenSize();
	  setSize(800,600); // tamanho do frame
      setTitle("Gerador versão 0.3"); // titulo do frame
	  addWindowListener(new WindowAdapter(){public void windowClosing(WindowEvent e){System.exit(0);}}); // fecha o frame
	  ta.setBackground(Color.black);
	  ta.setForeground(Color.red);
	  	  
	  //criar Arrays
	  classes = new Vector();
	  relacionamentos = new Vector();
	  dados = new Vector();
	  //criar menus
	  
	  mbar = new MenuBar();  //cria barra de menus
	  setMenuBar(mbar);		  //coloca barra de menus ao frame
	  
	  //define os submenus que serao adicionados ao menu
	  
	  mArquivo = new Menu("Arquivo");
	  mClasse = new Menu("Classe"); 
	  
	  //define menuItens de mArquivo
	  
	  mArquivo.add(new MenuItem("Abrir"));
	  mArquivo.add(new MenuItem("Salvar"));
	  mArquivo.add(new MenuItem("Fechar"));
	  mArquivo.addSeparator(); // insere separador
	  mArquivo.add(new MenuItem("Sair"));
	  
	 //define menuItem de mClasse
	 
	  mClasse.add(new MenuItem("Abrir Classe"));
	  mClasse.add(new MenuItem("Listar"));

	  //adiciona submenu ao menu
	  
	  mbar.add(mArquivo);	
	  mbar.add(mClasse);
	  
	  //adiciona escutadores ao menus
	  mArquivo.addActionListener(this);
	  mClasse.addActionListener(this);

	  add("Center", ta);
	  
	  setLocation((d.width - getWidth())/2,(d.height - getHeight())/2);
	  
	  show(); // esse show me custou semanas ahahahahahahaha
	}//construtora Gerador
	
	
	public void actionPerformed(ActionEvent e)
    {
	  String quemFoi = e.getActionCommand();
	  if (quemFoi.equals("Sair"))
	  { 
	  	System.out.println("O Gerador Ernest foi Fechado");
	  	System.exit(0);
	  }//if
	 
	  if(quemFoi.equals("Abrir Classe"))
	  {
	  	Frame2 frame2 = new Frame2();
	  }//if
	  
	  if(quemFoi.equals("Salvar"))
	  {
	  	salvar();
	  }//if
	  
	  if(quemFoi.equals("Abrir"))
	  {
	  	abrir();
	  }
	  
	  if(quemFoi.equals("Listar"))
	  {
	  	listar();
	  }
	  
	}//void actionPerformed
	
	

	
	public void criarClasse(String identificador,String tipo,String visuClasse)
	{
	  Classe classe = new Classe();	

      classe.setIdentificador(identificador);
      classe.setTipos(tipo);
      classe.setVisualidade(visuClasse);
	  ta.append("Criada classe: "+classe.getIdentificador()+"\n");
	  ta.append("Tipo: "+classe.getTipos()+"\n");
	  ta.append("Visualidade: "+classe.getVisualidade()+"\n");
      classes.addElement(classe);
	}//CriarClasse
	
	public void criarInfo(String nome, String organizacao, String email, String observacao)
	{
	  Dado dado = new Dado();
	  
	  dado.setNome(nome);
	  dado.setOrganizacao(organizacao);
	  dado.setEmail(email);
	  dado.setObservacao(observacao);
	  ta.append("Nome: "+dado.getNome()+"\n");
	  ta.append("Organização: "+dado.getOrganizacao()+"\n");
	  ta.append("Email: "+dado.getEmail()+"\n");	
	  ta.append("Observação: "+dado.getObservacao()+"\n");
	  dados.addElement(dado);	
	}//criarInfo
	
/*	public void criarAtributo(String identificador)
	{
		Atributo atributo = new Atributo();
		atributo.setIdentificador(identificador);
		ta.append("Atributo -> "+atributo.getIdentificador()+"\n");
		atributos.addElement(atributo);
	}
*/	
	protected void salvar()
	{
	  FileDialog fd = new FileDialog(this, "Salvar classes e relacionamentos", FileDialog.SAVE);
	  fd.setVisible(true);
	  if (fd.getFile() != null)
	  {
		try
		{
		  FileOutputStream outfile = new FileOutputStream(fd.getDirectory()+fd.getFile());
		  ObjectOutputStream out = new ObjectOutputStream(outfile);
		  out.writeObject(classes);
		  out.writeObject(dados);
		// out.writeObject(relacionamentos);
		  ta.append("Dados salvos no arquivo "+fd.getFile()+"\n");
		  out.close();
		}
		catch (IOException e)
		{
		  ta.append("Erro de IO: nao foi possivel salvar dados no arquivo\n");
		}

	  }

	}//protected void salvar
	
	
	protected void abrir()
	{
	  FileDialog fd = new FileDialog(this, "Recuperar classes e relacionamentos", FileDialog.LOAD);
	  fd.setVisible(true);
	  if (fd.getFile() != null)
	  {
	    try
		{
		  FileInputStream  infile = new FileInputStream(fd.getDirectory()+fd.getFile());
		  ObjectInputStream  in = new ObjectInputStream(infile);
		  classes = (Vector) in.readObject();
		  dados = (Vector) in.readObject();
		  //relacionamentos = (Vector) in.readObject();
		  ta.append("Dados recuperados do arquivo "+fd.getFile()+"\n");
	    }
		catch (ClassNotFoundException e)
		{
	      System.out.println("Erro: classe nao encontrada\n");
		}
		catch (IOException e)
		{
		ta.append("Erro de IO: nao foi possivel recuperar dados do arquivo\n");
		}
		catch (Exception e)
		{
		ta.append("Erro: nao foi possivel recuperar dados do arquivo\n");
		}
	  }//if
	}//void	
	
	protected void listar()
	{
		int i;
		 Classe classe;
		 Dado dado;
		//Relacionamento relacionamento;
		for( i = 0; i < dados.size(); i++)
		{	
		    dado = (Dado) dados.elementAt(i);
			ta.append("Nome ="+dado.getNome()+"\n");
			ta.append("Organizacao ="+dado.getOrganizacao()+"\n");
			ta.append("email ="+dado.getEmail()+"\n");
			ta.append("Observação ="+dado.getObservacao()+"\n");
			
		}
		
		ta.append("Listagem de classes:\n");
		for (i = 0; i < classes.size(); i++)
		{	
			classe = (Classe) classes.elementAt(i);
			ta.append("Classe ="+classe.getIdentificador()+"\n");
			ta.append("Modificador ="+classe.getTipos()+"\n");
			ta.append("Visibilidade ="+classe.getVisualidade()+"\n");
		}
	/*	ta.append("Listagem de relacionamentos:\n");
		for (i = 0; i < relacionamentos.size(); i++)
		{
			relacionamento = (Relacionamento) relacionamentos.elementAt(i);
			ta.append("\t"+relacionamento.getOrigem()+" --- "+relacionamento.getDestino()+"\n");
		}*/
	}
	
	
	
    public static void main(String args[])
    {
	  Gerador gerador = new Gerador();
	  gerador.setVisible(true);
	}//void main
	
}//class Gerador				

//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-//
						//Class Frame2
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-//

class Frame2 extends Frame implements ActionListener
{
  CardLayout cardLayout = new CardLayout();
  Panel cardPanel = new Panel();
  Panel p1, p2, p3, p4, p5, p6;
  Panel p11, p12, p13, p14;
  Panel p21, p22, p23, p24;
  Panel p31, p32;
  Panel p41, p42;
  Panel p51, p52;
  Panel p61, p62, p63, p64, p65, p66;
  Panel pBotao;
  Gerador gerador = new Gerador();;

  Button b01, b02, b03, b04, b05, b06;
  
  // componentes de interface para o painel de Classes
  TextField tf1;
  Label l1,l12,l13;
  Choice ch1, ch12;
  Button bClasse;

  // componentes de interface para o painel de Atributos
  TextField tf2, tf21, tf22;
  Label l2, l21, l22;
  Button bAtributo;

  // componentes de interface para o painel de Metodo
  Label l3;
  TextField tf3;
  Choice ch3;

  // componentes de interface para o painel de Generalizacao
  Label l4, l41;
  Choice ch4, ch41;
  
  //componentes de interface para o painel de Associacao
  Label l5;
  TextField tf5;
  
  //componentes de interface para o painel de Informacao
  Label l61, l62, l63;
  TextField tf6, tf61, tf62, tf63;
  TextArea ta2;
  Button bInfo;
  
  Frame2()
  {
  	super("Entrada de Dados");
    setSize(640,475);
    setResizable(false);
	Toolkit tk = Toolkit.getDefaultToolkit();
	Dimension d = tk.getScreenSize();
	setLocation((d.width - getWidth())/2,(d.height - getHeight())/2);
	
    addWindowListener(new WindowAdapter(){public void windowClosing(WindowEvent e){setVisible(false);}}); // fecha o frame

    setLayout(new BorderLayout());
    
    //Painel de Classe
    p1 = new Panel();
    p11 = new Panel();
    p12 = new Panel();
    p13 = new Panel();
    p14 = new Panel();
    
    p1.setLayout(new GridLayout(4,1));
    
    l1 = new Label("Nome da Classe"); //criar label
    p11.add(l1);
    
    tf1 = new TextField(20); //criar TextField
    p11.add(tf1);
    
    l12 = new Label("Modificador"); //criar Label
    p12.add(l12);
    
    bClasse = new Button("Criar Classe");
    bClasse.addActionListener(this);
    p13.add(bClasse);
    
    ch1 = new Choice(); //criando choice
    ch1.add("abstract"); //criando opcoes
    ch1.add("public");
    ch1.add("final");
    p12.add(ch1);
    
    l13 = new Label("Visibilidade"); //criando Label
    p14.add(l13);
    
    ch12 = new Choice();
    ch12.add("publica");
    ch12.add("não publica");
    p14.add(ch12);
    
    p1.add(p11);
    p1.add(p12);
    p1.add(p14);
    p1.add(p13);
    
    //Painel de Atributos
	p2 = new Panel();
	p21 = new Panel();
	p22 = new Panel();
	p23 = new Panel();
	p24 = new Panel();
	
	p2.setLayout(new GridLayout(4,1));
	l2 = new Label("Nome do Atributo");
	p21.add(l2);
	tf2 = new TextField(20);
	p21.add(tf2);
	
	l21 = new Label("Tipo");
	p22.add(l21);
	
	tf21 = new TextField(20);
	p22.add(tf21);
	
	l22 = new Label("Modificador");
	p23.add(l22);
	
	tf22 = new TextField(20);
	p23.add(tf22);
	
	bAtributo = new Button("Criar Atributo");
	p24.add(bAtributo);
	
	p2.add(p21);
	p2.add(p22);
	p2.add(p23);
	p2.add(p24);
	//painel Métodos
	
	p3 = new Panel();
	p3.setLayout(new GridLayout(4,1));
	p31 = new Panel();
	p32 = new Panel();

	l3 = new Label("Nome do Método"); //cria label
	p31.add(l3);	
	
	tf3 = new TextField(20); //criar textField
	p31.add(tf3);
	
	l3 = new Label("Visibilidade");
	p32.add(l3);
	
	ch3 = new Choice();  //cria choice
	ch3.add("public");
	ch3.add("private");
	ch3.add("protect");
	
	p32.add(ch3);
	
	p3.add(p31);
	p3.add(p32);
    
    //painel Generalizacao
	p4 = new Panel();
	p4.setLayout(new GridLayout(4,1));
	p41 = new Panel();
	p42 = new Panel();
	
	l4 = new Label("Classe 1"); //criar Label
	p41.add(l4);    
	
	ch4 = new Choice();  //criar choice
	p41.add(ch4);
	
	l41 = new Label("Classe 2"); //criar Label
	p42.add(l41);
	
	ch41 = new Choice();
	p42.add(ch41);
	
	p4.add(p41);
	p4.add(p42);
    
    //painel Associação
    
    p5 = new Panel();
    p5.setLayout(new GridLayout(5,1));
    p51 = new Panel();
    
    l5 = new Label("Nome Associação"); //criar Label
    p51.add(l5);
    
    tf5 = new TextField(20);
    p51.add(tf5);
    
    p5.add(p51);
    
    
    //painel info
    
    p6 = new Panel();
    p61 = new Panel();
    p62 = new Panel();
    p63 = new Panel();
    p64 = new Panel();
    p65 = new Panel();
    p66 = new Panel();
    
    p6.setLayout(new GridLayout(6,1));
    
    l61 = new Label("Nome"); //criar Label
    p61.add(l61);
    
    tf6 = new TextField(20);
    p61.add(tf6);
    
    l62 = new Label("Organização");
    p62.add(l62);
    
    tf61 = new TextField(20);
	p62.add(tf61);
	
	l62 = new Label("Email");
	p63.add(l62);
	
	tf62 = new TextField(40);
	p63.add(tf62);
	
	l63 = new Label("Observação");
	p64.add(l63);
	
	ta2 = new TextArea(30,20);
	p65.add(ta2); 
	
	bInfo = new Button("Criar");
	bInfo.addActionListener(this);
	p66.add(bInfo);
    
    p6.add(p61);
    p6.add(p62);
    p6.add(p63);
    p6.add(p64);
    p6.add(p65);
    p6.add(p66);
    
    
    //criar Botoes
    pBotao = new Panel();
    b06 = new Button("Info");
    b06.addActionListener(this);
	b01 = new Button("Classe");
	b01.addActionListener(this);
	b02 = new Button("Atributo");
	b02.addActionListener(this);
	b03 = new Button("Método");
	b03.addActionListener(this);
	b04 = new Button("Generalização");
	b04.addActionListener(this);
	b05 = new Button("Associação");
	b05.addActionListener(this);
	
	pBotao.add(b06);
	pBotao.add(b01);	
	pBotao.add(b02);
	pBotao.add(b03);
	pBotao.add(b04);
	pBotao.add(b05);

    add("South",pBotao);
    
    cardPanel.setLayout(cardLayout);
    cardPanel.add("card 6", p6);
    cardPanel.add("card 1", p1);
    cardPanel.add("card 2", p2);
    cardPanel.add("card 3", p3);
    cardPanel.add("card 4", p4);    
    cardPanel.add("card 5", p5);
    add(cardPanel, "Center");
    
    
    show();

  }//construtora
  
  
    public void actionPerformed(ActionEvent e)
	{
	  String quemFoi = e.getActionCommand();
	  Object quem = e.getSource();

	   if (quemFoi.equals("Classe"))
	     cardLayout.show(cardPanel, "card 1");
	   else if (quemFoi.equals("Atributo"))
	     cardLayout.show(cardPanel, "card 2");
	   else if (quemFoi.equals("Método"))
	     cardLayout.show(cardPanel, "card 3");
	   else if (quemFoi.equals("Generalização"))
         cardLayout.show(cardPanel, "card 4");
       else if (quemFoi.equals("Associação"))
         cardLayout.show(cardPanel, "card 5");
       else if (quemFoi.equals("Info"))
         cardLayout.show(cardPanel, "card 6");  
       if (quem == bClasse) 
       {
         gerador.criarClasse(tf1.getText(),ch1.getSelectedItem(),ch12.getSelectedItem());
         tf1.setText("");
       }
       
       if (quem == bInfo)
       {
       	 gerador.criarInfo(tf6.getText(),tf61.getText(),tf62.getText(),ta2.getText()); 
       }

       
    }

}//class Frame2




