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