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