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