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