 import javax.swing.*;  
  import java.io.*;

		public class Operacao
  {
  	 
	  int Agencia;
	  int Conta;
	  int CodProduto;
	  String Descricao;
	  int DtLiberacao;
	  int Contrato;
	
	         Operacao anterior;
	  static Operacao fim = null;
	  static Operacao inicioIntervalo = null;
	  static Operacao finalIntervalo = null;
	
  /**
   * Insira a descrição do método aqui.
   * Data de criação: (14/05/2002 10:20:52)
   * @return boolean
   */
  static boolean continua()
  {
		boolean ok = false;
	 	
		Object[] opcoes = {"Incluir no inicio","Incluir no meio",
	    	"Incluir no fim","Remover","Mostrar Todos","Sair"};
	    Object c = JOptionPane.showInputDialog(null,"Escolha a opção","Opções",
	      JOptionPane.INFORMATION_MESSAGE,null,opcoes,opcoes[0]); 
		   		    
	  if (c == null)
	      ok = false;
	  else
	     {
	       String s = (String)c;
	       if (s.equals("Incluir no inicio"))
	          incluir("inicio");
	       else
	       if (s.equals("Incluir no meio"))
	          incluir("meio");
	       else  
	       if (s.equals("Incluir no fim"))
	           incluir("fim");
	       else    
	       if (s.equals("Remover"))
	          remover();
	       else
	       if (s.equals("Mostrar Todos"))
		       mostrar();
	       else
		       return ok;
		   ok = true;
	      }
	   
		 return ok;    

  }          
  /**
   * Insira a descrição do método aqui.
   * Data de criação: (14/05/2002 10:30:15)
   */

   static void incluir(String texto)  
  {
   Operacao a = new Operacao();
   int numero;
   boolean retorno;
   inicioIntervalo = null;
   finalIntervalo = null;
   try
	{
	 numero     = Integer.parseInt(JOptionPane.showInputDialog("Contrato :"));
	 numero     = Math.abs(numero);
	 retorno    = verificaContrato(numero);
	 if  (retorno == true)
	   { 
	     a.Agencia     = Integer.parseInt(JOptionPane.showInputDialog("Agencia :"));
	     a.Conta       = Integer.parseInt(JOptionPane.showInputDialog("Conta  :"));
	     a.CodProduto  = Integer.parseInt(JOptionPane.showInputDialog("Cod. Produto :"));
	     a.Descricao   = JOptionPane.showInputDialog("Descrção do Produto :");  	   
	     a.DtLiberacao = Integer.parseInt(JOptionPane.showInputDialog("Dt. Liberaçao :"));
	     a.Agencia     = Math.abs(a.Agencia);
	     a.Conta       = Math.abs(a.Conta);
	     a.CodProduto  = Math.abs(a.CodProduto);
	     a.DtLiberacao = Math.abs(a.DtLiberacao);
	     a.Contrato    = numero;
	     
	     obterIntervalo(texto); 
	     a.anterior = inicioIntervalo;
	     	     
	     if  (finalIntervalo != null)
	         {
		       finalIntervalo.anterior = a; 
	         }
	     else 
	         { 
	          fim = a;
	         }
	          
	   }
	 else
		{ 
		  System.out.println("Contrato já existente");
	    }
	}
	   
   catch(Exception e)
	{
	 String erro = "houve um erro na inclu~sao dos dados:\n";
	 erro += e.getMessage();
	 System.out.println(erro);
	}	    
  }      
  /**
   * Insira a descrição do método aqui.
   * Data de criação: (14/05/2002 10:29:17)
   * @param args java.lang.String[]
   */
  public static void main( String[] args)
  {
  while(continua());
  System.exit(0); 
  }     
  /**
   * Insira a descrição do método aqui.
   * Data de criação: (14/05/2002 10:58:20)
   */
 
  static void mostrar()
  {
	Operacao atual = fim;
	System.out.println("\n============ Inicio do Cadastro ============\n");
	while(atual != null)
	  {
		  System.out.println("Contrato : " + atual.Contrato);
		  System.out.println("Agencia : " + atual.Agencia);
		  System.out.println("Conta : " + atual.Conta);
		  System.out.println("Cod.Produto : " + atual.CodProduto);
		  System.out.println("Descrição do Produto : " + atual.Descricao);
		  System.out.println("Dt.Liberação : " + atual.DtLiberacao);
		  System.out.println("\n");

		  atual = atual.anterior;
	  }	 
	  System.out.println("\n============ fIM do Cadastro ============\n"); 
  }      	
  /**
   * Insira a descrição do método aqui.
   * Data de criação: (14/05/2002 12:44:49)
   */
  static void obterIntervalo(int nro) 
  {
 	 
 	Operacao atual = fim;
 	 
 	while  (atual != null)  
	  {
	   if  (nro  <  atual.Contrato)
	      {
	       inicioIntervalo = atual.anterior;
	       finalIntervalo  = atual; 
	       atual  = atual.anterior;
	      }
	   else   
	       if  (inicioIntervalo == null) 
		       { 
	            inicioIntervalo = fim;
	            finalIntervalo  = null;
	            break;
		       }
		   else
		       break;
	       
	  }
   
  }    
 
  /**
   * Insira a descrição do método aqui.
   * Data de criação: (14/05/2002 11:52:31)
   */
   static void remover() 
  {
	int nro;
	boolean retorno; 
	DataInputStream d = new DataInputStream(System.in);
	try
	  {
		  System.out.println("Contrato a ser removido : ");
		  nro = Integer.parseInt(d.readLine());
	  }
	  
	catch(Exception e)
	  {
		  nro = -1;
	  }
	  
	retorno    = verificaContrato(nro);
	if  (retorno == true)
	   {
	    System.out.println("Contrato inexistente");
	   }
	else
	   { 
	 
	     Operacao atual  = fim;
	     Operacao antes  = null;
	     Operacao depois = null;
	
	     while(atual != null)
	      {
	     	  if (atual.Contrato == nro)
		         break;
		      antes = atual;
		      atual = atual.anterior; 
	      }
	 	try
	      {
		    depois = atual.anterior;
		    if (atual  == fim)
		      {
			    atual.anterior = null;
			    fim = depois; 
		      }   
		    else
		        antes.anterior = depois; 
		 
	       }
	      
	     catch(Exception e)
	       {
		     String erro = "houve um erro na delecao dos dados:\n";
	         erro += e.getMessage();
	         System.out.println(erro); 
	       }	  
	  
	     }   
  }        
  /**
   * Insira a descrição do método aqui.
   * Data de criação: (14/05/2002 10:51:17)
	*/
   static boolean verificaContrato(int nro) 
  {
	boolean valor;
	
	Operacao atual = fim;
	valor = true;
	
	while ((atual != null) && (valor == true))
	  {
		  if (nro == atual.Contrato)
		   {
		     valor = false;
		   }
		    
	  atual = atual.anterior;
	  }
	 
	return valor;   
	   
  }      
	/**
   * Insira a descrição do método aqui.
   * Data de criação: (14/05/2002 12:44:49)
   */
  static void obterIntervalo(String texto) 
  {
 	 
 	Operacao atual = fim;
 	 
 	while  (atual != null)  
	  {
		 if  (texto == "inicio")
		     { 
	          inicioIntervalo = atual.anterior;
	          finalIntervalo  = atual; 
	          atual  = atual.anterior;
		     } 
	     else
	        { 
	        if  (texto == "meio") 
	            if  (inicioIntervalo == null) 
		           { 
	               inicioIntervalo = atual.anterior;
	               finalIntervalo  = fim;
	               break;
		           }
		       else
		          {
		          inicioIntervalo = atual.anterior;
	              finalIntervalo  = atual;
		          break;
		          }
		     else
		         {
			      inicioIntervalo = fim;
	              finalIntervalo  = null;
		          break;   
		         }
	         }
   
	   }
  }          }  

