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