1   package kerho;
2   import java.io.OutputStream;
3   import java.util.Iterator;
4   
5   import fi.jyu.mit.ohj2.IO;
6   import fi.jyu.mit.ohj2.Mjonot;
7   import fi.jyu.mit.ohj2.Syotto;
8   /**
9    * Käyttöliittymäluokka Kerho-ohjelmaan
10   * Kerho-ohjelman menujen testaus.  Vain Lisää jäsen toimii jotenkin.<br>
11   * Tarvitsee avukseen JAR-paketin:
12   * <a href="http://www.mit.jyu.fi/vesal/kurssit/ohj2/ali/Ali.jar">Ali.jar</a><br>
13   * Aliohjelmien dokumentaatio on:
14   * <a href="http://www.mit.jyu.fi/vesal/kurssit/ohj2/ali/index.html">\kurssit\ohj2\ali</a><br>
15   * <br>
16   *
17   * @author  Vesa Lappalainen
18   * @version 1.0, 09.02.2003
19   * @version 1.1, 17.02.2008
20   */
21  public class Naytto {
22  
23    /**
24     * Viite kerhoon, jota tämä käyttöliittymä käyttää
25     */
26    private final Kerho kerho;
27  
28    private static enum Rivinvaihto {
29       /** Ei tulosteta rivinvaihtoa */ 
30       EITULE,
31       /** Tulostetaan rivinvaihto   */ 
32       TULEE
33    };
34    
35    
36    /**
37     * Käyttöliittymän alustus.  Käyttöliittymälle PITÄÄ kerto mitä
38     * Kerho se käsittelee.
39     * @param kerho jota käsitellään
40     * @throws SailoException jos kerhoa ei ole tuotu parametrina
41     */
42    public Naytto(Kerho kerho) throws SailoException {
43      if ( kerho == null ) throw new SailoException("Kerho täytyy antaa!");
44      this.kerho = kerho;
45    }
46  
47    
48    /**
49     * Tulostaa merkkijonon ja rivinvaihdon jos printlf on tosi
50     * @param s tulostettava merkkijono
51     * @param printlf tulostetaanko (TULEE) rivinvaihto vai ei (EITULE)
52     */
53    private static void tulosta(String s, Rivinvaihto printlf) {
54      System.out.print(s);
55      if ( printlf == Rivinvaihto.TULEE ) System.out.println();
56    }
57  
58    
59    /**
60     * Tulostaa merkkijonon ja rivinvaihdon
61     * @param s Tulostettava rivi
62     */
63    private static void tulosta(String s) {
64      tulosta(s,Rivinvaihto.TULEE);
65    }
66  
67    
68    /**
69     * Tulostaa merkkijonon mutt ei rivinvaihtoa
70     * @param s Tulostettava rivi
71     */
72    private static void tulostaEiRV(String s) {
73      tulosta(s,Rivinvaihto.EITULE);
74    }
75  
76    
77    /**
78     * Tulostaa n kappaletta tyhjiä rivejä
79     * @param n tulostettavien tyhjien rivien lukumäärä
80     */
81    private static void tulostaRivinvaihtoja(int n) {
82      for (int i=0; i<n; i++) tulosta("");
83    }
84  
85    
86    /**
87     * Tulostaa kirjaimen ja tekstin alleviivattuna sekä tyhjää ympärille.
88     * <pre>
89     * Kutsu: otsikko('1',"Kissa istuu puussa");
90     * tulostaa:
91     * --- 4 tyhjää riviä
92     * 1. Kissa istuu puussa
93     * =====================
94     * --- 2 tyhjää riviä
95     * </pre>
96     * @param kirjain alkuun tulostettava kirjain
97     * @param teksti kirjaimen perään tulostettava. teksti
98     */
99    private static void otsikko(char kirjain, String teksti) {
100     tulostaRivinvaihtoja(4);
101     tulosta("" + kirjain + ". " + teksti);
102     tulosta(Mjonot.tayta("=",1+2+teksti.length()));
103     tulostaRivinvaihtoja(2);
104   }
105 
106   
107   /**
108    * Tulostaa "Ei toimi vielä" ja jää odottamaan näppäimen painallusta
109    */
110   private void eiToimi()  {
111     tulosta("Ei toimi vielä!");
112     IO.odota_jotakin();
113   }
114 
115   
116   /**
117    * Avustustoiminto
118    * @param valinta kirjain jolla toiminto aktivoitiin
119    */
120   private void avustus(char valinta) {
121     otsikko(valinta, "Avustus");
122     eiToimi();
123   }
124 
125   
126   /**
127    * Tulostaa jäsenen tiedot
128    * @param os tietovirta johon tulostetaan
129    * @param jasen tulostettava jäsen
130    */
131   private void tulosta(OutputStream os, final Jasen jasen) {
132     jasen.tulosta(os);
133     int jid = jasen.getTunnusnro();
134     for (Iterator<Harrastus> i=kerho.harrastusIterator(jid); i.hasNext(); ) {
135       Harrastus har = i.next();
136       har.tulosta(os);
137     }
138 /*    
139     ArrayList<Harrastus> harrastukset = kerho.annaHarrastukset(jasen);
140     for (Harrastus har: harrastukset ) {
141         har.tulosta(os);
142     }
143  */   
144   }
145 
146 
147   /**
148    * Kystään tiedot yhdelle jäsenelle.  Muutetaan suoraan jäsenen tietoja.
149    * @param jasen muutettava jäsen
150    * @return halusiko käyttäjä pois muutoksesta (false) vai onnistuiko muutos (true)
151    */
152   private boolean kysyTiedot(Jasen jasen) {
153     int kenttia = jasen.getKenttia(); 
154     int eka = jasen.ekaKentta();
155     for (int k=eka; k<kenttia; k++ ) {
156       while ( true ) { // Kysyy yhden kentän tietoja
157         String oletus = jasen.anna(k);  
158         String vastaus = Syotto.kysy(jasen.getKysymys(k),oletus);
159         vastaus = Mjonot.poista_2_tyhjat(vastaus).trim();
160         if ( k == eka && "".equals(vastaus) ) return false;
161         if ( ".".equals(vastaus) ) return true;
162         if ( "q".equals(vastaus) ) return false;
163         String virhe = jasen.aseta(k,vastaus);
164         if ( virhe == null ) break;
165         System.out.println(virhe);
166         System.out.println("Annatko tiedon uudelleen.");
167       }  
168     }      
169     return true;
170   } 
171 
172 
173   /**
174    * Kysy tiedot uudelle jäsenelle.  Luodaan uusi jäsen ja rekisteröidään.
175    * Jos jäsentä ei halutakkaan lisätä, niin mahdolliset häneen liittyvät
176    * tiedot tulee poistaa.
177    * @return halutaanko vielä jatkaa (true) vai lopettaa kyseleminen (false)
178    */
179   private boolean kysyUusiJasen() {
180     Jasen jasen = new Jasen();
181     jasen.rekisteroi();
182     while ( kysyTiedot(jasen) ) {
183       tulosta("Lisätäänkö");
184       tulosta(System.out,jasen);
185       tulostaEiRV(":");
186       if ( IO.kylla_vastaus() ) {
187         try {
188           kerho.lisaa(jasen);
189           return true;
190         } catch ( SailoException ex ) {
191           tulosta(ex.getMessage());
192         }
193       }
194     }
195     kerho.poista(jasen.getTunnusnro());
196     return false;
197   }
198 
199   
200   /**
201    * Uuden jäsenen lisäys
202    * @param valinta kirjain jolla toiminto aktivoitiin
203    */
204   private void lisaaUusiJasen(char valinta) {
205     otsikko(valinta,"Uuden jäsenen lisäys");
206     while ( kysyUusiJasen() ); // NOPMD
207   }
208 
209   
210   /**
211    * Jäsenen tietojen etsiminen
212    * @param valinta kirjain jolla toiminto aktivoitiin
213    */
214   private void etsiJasenenTiedot(char valinta) {
215     otsikko(valinta,"Etsi jäsenen tiedot");
216     eiToimi();
217   }
218 
219 
220   /**
221    * Ohjelman tulosteet, pitäisi tulla alimenu
222    * @param valinta kirjain jolla toiminto aktivoitiin
223    */
224   private void tulosteet(char valinta) {
225     otsikko(valinta,"Tulosteet");
226     tulosta("Toimii toistaiseksi vain näytölle");
227     tulosta("---------------------------------------------------------");
228 
229     int i = 0;
230      for ( Iterator<Jasen> it = kerho.iterator(); it.hasNext(); ) {
231       Jasen jasen = it.next();  
232     //for (Jasen jasen : kerho ) {
233       //Jasen jasen = kerho.annaJasen(i);
234       tulosta("Jäsen nro: " + i++);
235       tulosta(System.out,jasen);
236       tulosta("");
237     }
238 
239     tulosta("---------------------------------------------------------");
240     IO.odota_jotakin();
241   }
242   
243   
244   /**
245    * Tietojen korjailu
246    * @param valinta kirjain jolla toiminto aktivoitiin
247    */
248   private void tietojenKorjailu(char valinta) {
249     otsikko(valinta,"Tietojen korjailu");
250     eiToimi();
251   }
252 
253 
254   /**
255    * Jäsenmaksujen päivitys
256    * @param valinta kirjain jolla toiminto aktivoitiin
257    */
258   private void paivitaJasenmaksuja(char valinta) {
259     otsikko(valinta,"Päivitä jäsenmaksuja");
260     eiToimi();
261   }
262 
263 
264   /**
265    * Tulostaa ohjelman päämenun
266    */
267   private void paamenu() {
268     tulosta("\n\n\n\n");
269     tulosta("Jäsenrekisteri");
270     tulosta("==============");
271     tulosta("");
272     tulosta("Kerhossa " + kerho.getNimi()+ " on " +
273              kerho.getJasenia() + " jäsentä.");
274     tulosta("");
275     tulosta("Valitse:");
276     tulosta("   ?  = avustus");
277     tulosta("   0  = lopetus");
278     tulosta("   1  = lisää uusi jäsen");
279     tulosta("   2  = etsi jäsenen tiedot");
280     tulosta("   3  = tulosteet");
281     tulosta("   4  = tietojen korjailu");
282     tulosta("   5  = päivitä jäsenmaksuja");
283     tulostaEiRV("   :");
284   }
285 
286   
287   /**
288    * Silmukka jossa odotetaan näppäintä ja suoritetaan vastaava toiminto.
289    * 0:n painaminen lopettaa silmukan ja palaa kutsuvaan ohjelmaan.
290    * @return palauttaa 0 jos kaikki meni hyvin, 1 jos tuli virhe
291    */
292   public int paavalinta() {
293     char nappain;
294 
295     while ( true ) {
296 
297       paamenu();
298 
299       nappain = IO.odota_nappain("?012345",IO.EI_OLETUSTA,IO.MERKKI_ISOKSI);
300 
301       switch (nappain) {
302         case '?': avustus(nappain);               break;
303         case '0': return 0;
304         case '1': lisaaUusiJasen(nappain);        break;
305         case '2': etsiJasenenTiedot(nappain);     break;
306         case '3': tulosteet(nappain);             break;
307         case '4': tietojenKorjailu(nappain);      break;
308         case '5': paivitaJasenmaksuja(nappain);   break;
309         default : tulosta("Näin ei voi käydä!");  return 1;
310       }
311 
312     }
313   }
314 
315   
316   /**
317    * Tulostaa ohjelman logon
318    */
319   private void logo() {
320     tulosta("");
321     tulosta("      ###################################");
322     tulosta("      #   J Ä S E N R E K I S T E R I   #");
323     tulosta("      #     versio 9.95                 #");
324     tulosta("      #     Hannu Hanhi                 #");
325     tulosta("      ###################################");
326   }
327 
328 
329   /**
330    * Tulostaa ohjelman alkuohjeet
331    */
332   public void ohjeet() {
333     logo();
334     tulosta("");
335     tulosta("Tällä ohjelmalla ylläpidetään kerhon jäsenrekisteriä.");
336   }
337 
338 
339   /**
340    * Tulostaa loppukiitokset
341    */
342   public void kiitokset() {
343     tulosta("");
344     tulosta("KIITOS KÄYTÖSTÄ JA TERVETULOA UUDELLEEN");
345     tulosta("");
346     tulosta("");
347   }
348 
349 
350   /**
351    * Lukee kerhon tiedot levyltä.  Kysyy ensin käyttäjältä tiedoson nimen.
352    * @return palauttaa tyhjän merkkijonon jos kaikki menee hyvin, muuten
353    * virhetekstin
354    */
355   public String lueKerho() {
356     tulosta("Anna kerhon nimi>");
357     eiToimi();
358     try {
359       kerho.lueTiedostosta("kelmit");
360     } catch ( SailoException ex ) {
361       System.out.println(ex.getMessage());
362       return ex.getMessage();
363     }
364 
365     return "";
366   }
367 
368 
369   /**
370    * Tallentaa kerhon tiedot levylle.
371    * @return palauttaa tyhjän merkkijonon jos kaikki menee hyvin, muuten
372    * virhetekstin
373    */
374   public String talletaKerho() {
375     logo();
376 
377     tulosta("");
378 
379     tulosta("Talletus...");
380     try {
381       kerho.talleta();
382     } catch ( SailoException ex ) {
383       System.out.println(ex.getMessage());
384       return ex.getMessage();
385     }
386 
387     return "";
388   }
389 
390 
391   /**
392    * Ohjelman pääohjelma
393    * @param args komentorivin parametrit, ei käytössä vielä
394    */
395   public static void main(String[] args) {
396     Kerho kerho = new Kerho();
397 
398     try {
399       Naytto naytto = new Naytto(kerho);
400 
401       naytto.ohjeet();
402 
403       naytto.lueKerho();
404 
405       naytto.paavalinta();
406 
407       naytto.talletaKerho();
408 
409       naytto.kiitokset();
410     }
411     catch (Exception ex) {
412       System.out.println("VIRHE: " + ex.getMessage());
413     }
414   }
415 
416 }
417 
418