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