001package fi.jyu.mit.ohj2;
002/**
003 * Alkeellinen IO-luokka hoitamaan mm. yhden näppäimen painallukseen
004 * liittyviä tehtäviä.
005 *
006 * @author Vesa Lappalainen
007 * @version 1.0, 10.02.2003
008 */
009public class  IO {
010
011  /**
012   * Luetaan yksi käyttäjän painama merkki
013   * @return käyttäjän painama merkki
014   */
015  public static char lue_merkki() {  // NOPMD sallitaan alleviiva historian painolastina
016//    String s = Syotto.lue("");
017//    if ( s.length() == 0 ) return 0;
018//    return s.charAt(0);
019    return Readkey.getChar();
020  }
021
022  /**
023   *  Rivinvaihto
024   */
025  public static final String RIVINVAIHTO = "\r\n";
026  
027  /**
028   * Ei käytetä oletusarvoa
029   */
030  public static final char EI_OLETUSTA = 0;
031  
032  /**
033   * Kaikki merkit kelpaavat
034   */
035  public static final String KAIKKI_KELPAA = null;
036  
037  /**
038   * Muutetaan merkit isoiksi ennen vertailua ja palautusta
039   */
040  public static final boolean MERKKI_ISOKSI = true;
041
042
043  /**
044   * Odotetaan yhden merkin painamista.  Vain jonossa kelpaavat olevat
045   * hyväksytään.  Jos painetaan [Enter], palautetaan merkki oletus.
046   * Jos merkki_isoksi == true, muutetaan merkki ennen vertailua ja palautusta
047   * isoksi kirjaimeksi.
048   * Esim.  <pre>c = odota_nappain("KE",'K',MERKKI_ISOKSI)</pre>
049   * odottaa kunnes painetaan joko K,k,E,e tai [Enter].   Jos painetaan
050   * [Enter], palautetaan 'K', muuten ko. painettu merkki.
051   *
052   * @param kelpaavat Joukko kirjaimia jotka kelpaavat. null = kaikki kelpaa
053   * @param oletus Merkki joka palautetaan [Enter] painamisesta, 0 = ei oltusta
054   * @param merkki_isoksi muutetaanko merkki isoksi kirjaimeksi (true) vai ei
055   * @return käyttäjän painama merkki, joko joukosta kelpaavat tai sitten oletus
056   */
057  public static char odota_nappain(String kelpaavat, char oletus,  // NOPMD sallitaan alleviiva historian painolastina
058                                   boolean merkki_isoksi) {  
059    char painettu;
060    do {
061      painettu = lue_merkki();
062      if ( merkki_isoksi ) painettu = Character.toUpperCase(painettu);
063      if ( oletus != EI_OLETUSTA && RIVINVAIHTO.indexOf(painettu) >= 0 )
064        return oletus;
065    } while ( kelpaavat != null && kelpaavat.indexOf(painettu) < 0 );
066    return painettu;
067  }
068
069
070  /**
071   * Odotetaan kunnes käyttäjä painaa jotakin merkkiä
072   */
073  public static void odota_jotakin()   {  // NOPMD sallitaan alleviiva historian painolastina
074    System.out.println("Paina jotakin!");
075    odota_nappain(KAIKKI_KELPAA,EI_OLETUSTA,MERKKI_ISOKSI);
076  }
077
078
079  /**
080   * Odotetaan kunnes käyttäjä painaa joko K tai E
081   * @return true jos käyttäjä painaa K, muuten false
082   */
083  public static boolean kylla_vastaus()   { // NOPMD sallitaan alleviiva historian painolastina
084    return (odota_nappain("KE",'K',MERKKI_ISOKSI)=='K');
085  }
086
087  
088  /**
089   * Testataan syöttöluokkaa
090   * @param args ei käytössä
091   */
092  public static void main(String[] args) {
093     String kelpaavat = "ABCDE";
094     System.out.print("Paina joku kirjaimista " + kelpaavat + " (F) :");
095     char c = odota_nappain(kelpaavat,'F',MERKKI_ISOKSI);
096     System.out.println();
097     System.out.println("Painoit " + c);
098     odota_jotakin();
099  }
100}
101