/*
 * ScanKey.java
 *
 * Created on 23 febbraio 2004, 21.33
 */
package Calc;
/**
 *
 * @author  stfn
 */
public class ScanKey {
    String result;
    /** Costruttore */
    public ScanKey() {
    }
    //ritorna il carattere letto da standard input
    private char readChar()
    {
        // inizializza il valore della variabile che sarà restituita
        //al valore più pessimistico
        int charAsInt = -1;     
        try
        {
            //legge il carattere digitato sulla tastiera
            charAsInt = System.in.read();
        }
        catch(java.io.IOException e)
        {
            //viene gestito qui un eventuale errore
            System.out.println(e.getMessage());
            System.out.println("Fatal error. Ending Program.");
            System.exit(0);
        }
        //ritorna il carattere: se tutto è andato bene viene restituito
        //il carattere digitato, diversamente ritorna -1
        return (char)charAsInt;
    }

    public String get(String msg){
        System.out.print(msg);
        return readLine();
    }
    // Reads an entire line from the standard input.
    public String readLine()
    {
        char nextChar;
        boolean done = false;
        //inizializza il valore della variabile privata della
        //classe ad una stringa nulla
        result = "";

        while (!done)
        {
            nextChar = readChar();
            if (nextChar == '\n'){
                //considera il carattere di new line come
                //fine input da parte dell'utente
                done = true;
            }
            else{
                //appende il carattere letto e testa lo stato
                //dell'attributo result
                AppendKey(nextChar);
                if(!test())
                    result="";
            }
        }
        //
        return result;
    }		

    protected boolean test(){
        //lo scopo di questo metodo è quello di controllare 
        //se l'attributo result contiene un valore accettabile.
        //Come per il metodo AppendKey, in questa versione della
        //classe non viene svolto alcun controllo particolare
        //dato che possono essere accettati tutti i caratteri:
        //tuttavia tale metodo risulta utile come "traccia" per 
        //un metodo di overriding in classi più specializzate
        //ereditate da questa
         return (result.length()!=0);
    }
    
    protected void AppendKey(char rdchar){
        //questo metodo serve per eventuali test prima della
        //assegnazione del nuovo valore a result: 
        //il metodo utilizzato in questa classe non effettua in 
        //realtà nessun testo, ma serve come traccia per metodi
        //di overriding definiti in classi che ereditano dalla presente
        result = result + rdchar;
    }
}
