001    import java.io.*;
002    import java.util.*;
003    import kerho.*;
004    
005    import fi.jyu.mit.ohj2.*;
006    /**
007     * Käyttöliittymäluokka Kerho-ohjelmaan
008     * Kerho-ohjelman menujen testaus.  Varsinaiset toiminnot puuttuvat.<br>
009     * Tarvitsee avukseen JAR-paketin:
010     * <a href="http://www.mit.jyu.fi/vesal/kurssit/ohj2/ali/Ali.jar">Ali.jar</a><br>
011     * Aliohjelmien dokumentaatio on:
012     * <a href="http://www.mit.jyu.fi/vesal/kurssit/ohj2/ali/index.html">\kurssit\ohj2\ali</a><br>
013     * <br>
014     *
015     * Lisätty tietorakenteen käyttö jäsenistön osalta.
016     * Uuden jäsenen lisääminen lisää aina vain Aku Ankan (tosi sat. hetulla).
017     * Tulostus tulostaa kaikki jäsenet.
018     * Harrastusten osalta lisää vain pitsin nypläyksiä.
019     *
020     * Muutokset:  02.04.2003, tiedon syöttö<br>
021     *
022     * @author  Vesa Lappalainen
023     * @version 1.0, 09.02.2003
024     * @version 1.1, 23.02.2003
025     * @version 1.2, 20.03.2003
026     * @version 1.3, 02.04.2003
027     */
028    public class Naytto {
029    
030      /**
031       * Viite kerhoon, jota tämä käyttöliittymä käyttää
032       */
033      private Kerho kerho;
034      private Jasen nykyhenkilo = null;
035    
036      /**
037       * Käyttöliittymän alustus.  Käyttöliittymälle PITÄÄ kerto mitä
038       * Kerho se käsittelee.
039       * @param kerho jota käsitellään
040       * @throws Exception jos kerhoa ei ole tuotu parametrina
041       */
042      public Naytto(Kerho kerho) throws Exception {
043        if ( kerho == null ) throw new Exception("Kerho täytyy antaa!");
044        this.kerho = kerho;
045      }
046    
047      /**
048       * Apualiohjelma tulostamiseen
049       * @param s tuolsettava merkkijono
050       * @param printlf tulostetaanko (true) rivinvaihto vai ei (false)
051       */
052      private static void tulosta(String s, boolean printlf) {
053        System.out.print(s);
054        if ( printlf ) System.out.println();
055      }
056    
057      /**
058       * Apualiohjelma tulostamiseen, tulostaa myös rivinvaihdon.
059       * @param s tulostettava merkkijono
060       */
061      private static void tulosta(String s) {
062        tulosta(s,true);
063      }
064    
065      /**
066       * Tulostaa n kappaletta tyhjiä rivejä
067       * @param n tulostettavien tyhjien rivien lukumäärä
068       */
069      private static void tyhja(int n) {
070        for (int i=0; i<n; i++) tulosta("");
071      }
072    
073      /**
074       * Tulostaa kirjaimen ja tekstin alleviivattuna sekä tyhjää ympärille.
075       * <pre>
076       * Kutsu: otsikko('1',"Kissa istuu puussa");
077       * tulostaa:
078       * --- 4 tyhjää riviä
079       * 1. Kissa istuu puussa
080       * =====================
081       * --- 2 tyhjää riviä
082       * </pre>
083       * @param kirjain alkuun tulostettava kirjain
084       * @param teksti kirjaimen perään tulostettava. teksti
085       */
086      private static void otsikko(char kirjain, String teksti) {
087        tyhja(4);
088        tulosta("" + kirjain + ". " + teksti);
089        tulosta(Mjonot.tayta("=",1+2+teksti.length()));
090        tyhja(2);
091      }
092    
093      /**
094       * Tulostaa "Ei toimi vielä" ja jää odottamaan näppäimen painallusta
095       */
096      void ei_toimi()  {
097        tulosta("Ei toimi vielä!");
098        IO.odota_jotakin();
099      }
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