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