/** FibonacciLong
 *  Programa que calcula la funcion de Fibonacci utilizando valores
 *  de tipo long, recibe la posicion que se desea calcular.
 *CARLOS PIARPUEZAN 256629  */
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class FibonacciLong extends JFrame implements ActionListener
{
	public int n;
	public JPanel contentPane;
	public JPanel controles;
	private JTextArea output;
	private JButton ejecutar;
	private JLabel message;
	private JTextField posicion;
	
    public static long Fibonacci(int n)
    {
	long i = 1;
	long j = 0;
	
	for(int k=1;k<=n;k++)
    {   
	    j=i+j;
	    i=j-i;
	} 
	return j;
    }
    
    public Container crearContentPane()
	{
		controles = new JPanel();
		output = new JTextArea();
		output.setEditable(false);
		ejecutar = new JButton("Ejecutar");
		ejecutar.addActionListener(this);
		message = new JLabel("Digite la n-esima posicion de Fibonacci:");
		posicion = new JTextField();
		contentPane = new JPanel(new GridLayout(1,2));
        contentPane.setOpaque(true);
        controles.setBorder(BorderFactory.createEmptyBorder(
                                        30, //arriba
                                        30, //izquierda
                                        10, //abajo
                                        30) //dereha
                                        );
		controles.setLayout(new GridLayout(3,1));
		controles.add(message);
		controles.add(posicion);
		controles.add(ejecutar);
		contentPane.add(controles);
		contentPane.add(output);
		
		return contentPane;	
	}
	public void actionPerformed(ActionEvent e)
	{
		if (e.getSource() == ejecutar)
		{
			long resultado=0;
			n = Integer.parseInt(posicion.getText());
			resultado = Fibonacci(n);
			if(resultado < 0)
	   		{
	   		output.append("Overflow!!!\n");
       		}
       		else
       		{
	   		String Result = new String();
	   		Result = Long.toString(resultado);
	   		output.append("Fibonacci "+posicion.getText()+" -esimo es: "+Result+"\n");
       		}
		}
	}
	private static void crear_y_MostrarGUI()
    {
        //Con esto se garantiza que la apariencia se de la ventana sea agradable
        JFrame.setDefaultLookAndFeelDecorated(true);

        //Crea y configura la ventana
        JFrame frame = new JFrame("Programa FibonacciLong");//se crea la ventana usando el contructor que usa un String
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//se define que se destruya la ventana al cerrarla.
        frame.setResizable(false);//El tamaņo de la ventana no es redefinible

        //Crea y configura el content pane
        FibonacciLong demo = new FibonacciLong();
        frame.setContentPane(demo.crearContentPane());

        //Despliego y muestro la ventana
        frame.setSize(600, 260);//se le da un tamaņo
        frame.setVisible(true);//se hace visible
    }
    /**
     *Crea y muestra la ventana principal
     */
    public static void main(String[] args)
    {
      System.out.println("Cargando componentes...");
      crear_y_MostrarGUI();
    }
} 