/** FILE: intrfaccia.java **/


import SIMULA.simulator;
import java.awt.*;
import java.io.*;


/*
 * CLASS interfaccia
 *
 * finestra dove settare i parametri, cliccando sul pulsante "Lancia il Simulatore":
 *     1) controlla l'attendibilita e la correttezza dei dati (i messaggi di errore --> sul terminale)
 *     2) lancia  thread di tipo simulator uno alla volta (aspetta finche uno è in esecuzione 
 *        per lanciare il successivo) e si nasconde fino a quando la simulazione è finita
 * --> vedi package SIMULA - simulator.java
 */

class interfaccia extends Frame
{
    /*
     * COSTRUTTORE
     * 
     * imposta la posizione e l'ordine degli oggetti(awt) nella finestra
     */

    interfaccia(char c)
    {
        et_titolo = new Label("Scelta politica");
        et_toll = new Label("Tolleranza:      ");
        et_toll2 = new Label("Tolleranza:      ");
        et_alpha = new Label("Fattore Alpha: ");
        et_file = new Label("File da aprire: ");
        et_beta = new Label("Fattore Beta:   ");
        aster = new Label("/  NON SERVE  /");
        cl0 = new CardLayout();
        poli = new Choice();
        toll = new TextField("10", 11);
        alpha = new TextField("", 11);
        file = new TextField("", 11);
        beta = new TextField("", 11);
        ok = new Button(" Lancia il Simulatore ");
        annulla = new Button(" Annulla  ");
        cards = new Panel();
        mia = new Panel();
        altre = new Panel();
        alphapan = new Panel();
        pulsanti = new Panel();
        politica = new Panel();
        testfile = new Panel();
        betapan = new Panel();
        filepuls = new Panel();
        entro = true;
        setTitle("Impostare il simulatore");
        cards.setLayout(cl0);
        politica.add(et_titolo);
        politica.add(poli);
        mia.add(et_toll);
        mia.add(toll);
        altre.add(et_toll2);
        altre.add(aster);
        switch(c)
        {
        case 49: // '1'
            poli.addItem("Anarchica");
            poli.addItem("F.I.F.O.");
            poli.addItem("Personalizzata");
            cards.add("mia", mia);
            cards.add("altre", altre);
            break;

        case 50: // '2'
            poli.addItem("F.I.F.O.");
            poli.addItem("Personalizzata");
            poli.addItem("Anarchica");
            cards.add("mia", mia);
            cards.add("altre", altre);
            break;

        case 51: // '3'
            poli.addItem("Personalizzata");
            poli.addItem("Anarchica");
            poli.addItem("F.I.F.O.");
            cards.add("altre", altre);
            cards.add("mia", mia);
            break;

        }
        testfile.add(et_file);
        testfile.add(file);
        pulsanti.add(annulla);
        pulsanti.add(ok);
        alphapan.add(et_alpha);
        alphapan.add(alpha);
        betapan.add(et_beta);
        betapan.add(beta);
        filepuls.add(politica);
        filepuls.add(cards);
        filepuls.add(testfile);
        filepuls.add(alphapan);
        filepuls.add(betapan);
        filepuls.add(pulsanti);
        add(filepuls);
        resize(260, 300);
        cl0.show(cards, "altre");
        show();
    }

    /* 
     * COSTRUTTORE(2)
     *
     * imposta i valori nei campi di testo
     */

    interfaccia(float f, int i, String s, char c, boolean flag, int ripeti)
    {
        this(c);
        this.ripeti = ripeti;
        nograp = flag;
        alpha.setText(String.valueOf(f));
        beta.setText(String.valueOf(i));
        file.setText(String.valueOf(s));
    }


    /* 
     * METDO paint()
     *
     * imposta la posizione e le dimenzioni della finesta
     */

    public void paint(Graphics g)
    {
        if(entro)
        {
            setBounds(385, 140, 260, 300);
            entro = false;
        }
    }


    /* 
     * METODO handleEvent()   --> RIDEFINIZIONE
     *
     * viene chiamato dal run-time di java ogni volta che si verifica un evento in questa finestra
     * gestisce la finestra, anche il pulsante "lancia il simulatore". Se questo viene premuto
     * controlla l'attendibilita e la correttezza dei dati nei campi di testo mettendo tutto tra un
     * blocco try/catch. se non si verificano errori viene lanciato un thread simulator.
     * --> vedi package SIMULA - simulator.java
     */

    public boolean handleEvent(Event event)
    {
        if(event.id == 201)  // premuta la X in alto a destra, QUIT
            System.exit(0);
        if(event.target == poli)  // gestione della visualizzazione del campo di testo per la tolleranza
            if(poli.getSelectedItem() == "Personalizzata")
                cl0.show(cards, "mia");
            else
                cl0.show(cards, "altre");
        if(event.target == annulla && event.id == 1001)  // se viene premuto il pulsante annulla, QUIT
            System.exit(0);
        if(event.target == ok && event.id == 1001)  // se viene prenuto il pulsante "lancia il simulatore"
            try
            {
                hide();
                float f = (new Float(alpha.getText())).floatValue();
                int i = Integer.parseInt(toll.getText());
                int j = Integer.parseInt(beta.getText());
                boolean flag = poli.getSelectedItem() != "Anarchica";
                if(f <= 1.0F)
                {
                    System.out.println("Il Fattore alpha deve essere maggiore di 1.0");
                    show();
                }
                else
                if(i < 1)
                {
                    System.out.println("La tolleranza non deve essere minore di 1");
                    show();
                }
                else
                if(j < 1 || j > 1000)
                {
                    System.out.println("Il Fattore beta deve essere compreso tra 1 e 1000");
                    show();
                }
                else
                {
                    for(int k = 0; k < ripeti; k++)
                    {
                        if(poli.getSelectedItem() == "Personalizzata")
                            simo = new simulator(i, f, j, new FileInputStream(file.getText()), file.getText(), nograp);
                        else
                            simo = new simulator(flag, f, j, new FileInputStream(file.getText()), file.getText(), nograp);
                        if(simo != null)
                        {
                            simo.start();  // lancia il simulatore --> vedi package SIMULA - simulator.java
                            simo.join();   // aspetta che il simulatore termini
                            simo = null;
                            System.gc();   // avvia il garbage-collection di java per la liberazione della memoria inutilizzata
                        }
                    }
                    show();
                }
            }
            catch(FileNotFoundException _ex)  // non esiste il file
            {
                System.out.println("Non trovo il File.");
                show();
            }
            catch(NumberFormatException _ex)  // è stato inserito male un valore nei campi di testo
            {
                System.out.println("Il Formato di un Numero e\' Errato (alpha/tempo/tolleranza)");
                show();
            }
            catch(IOException _ex)  // errore nell'apertura del file
            {
                System.out.println("Eccezione I/O");
                show();
            }
            catch(InterruptedException _ex)  //  se si verifica una interruzione
            {
                System.out.println("Interruzione");
                show();
            }
        return super.handleEvent(event);
    }

    /* 
     * VARIABILI e OGGETTI
     *
     */

    Label et_titolo;
    Label et_toll;
    Label et_toll2;
    Label et_alpha;
    Label et_file;
    Label et_beta;
    Label aster;
    CardLayout cl0;
    Choice poli;
    TextField toll;
    TextField alpha;
    TextField file;
    TextField beta;
    Button ok;
    Button annulla;
    Panel cards;
    Panel mia;
    Panel altre;
    Panel alphapan;
    Panel pulsanti;
    Panel politica;
    Panel testfile;
    Panel betapan;
    Panel filepuls;
    boolean entro;
    boolean nograp;
    simulator simo;
    int ripeti;
}