diff --git a/hiihdot.dat b/hiihdot.dat new file mode 100644 index 0000000000000000000000000000000000000000..c9830eb70e16d1fa28eab1b31f468aaebd99505f --- /dev/null +++ b/hiihdot.dat @@ -0,0 +1,3 @@ +3|4|1.12.2020|10.0||-10|0.0|0.0|100.0 +3|4|1.12.2020|10.0||-10|0.0|0.0|1.0E8 +5|3|1.1.2020|10.0||-5|200.0|180.0|180.0 diff --git a/nimet.dat b/nimet.dat new file mode 100644 index 0000000000000000000000000000000000000000..61d0e4f7984112606e0f0cd93c4cea0417ad1131 --- /dev/null +++ b/nimet.dat @@ -0,0 +1,4 @@ +nimet.dat +5 +3|Veikko|Hakulinen|01.01.2020|Kuopio|040|@|2000 +4|Hemppa|Myyrä|12.6.1986|Laukaa|0407243639|s.posti@testi|2020 diff --git a/src/Tietorakenteet/Hiihdot.java b/src/Tietorakenteet/Hiihdot.java index 4e0ed8ba1f4acf6e6547ccfe4637ddc006419263..1bf5a4189f7e507407830e781a6af3c68d62ed8e 100644 --- a/src/Tietorakenteet/Hiihdot.java +++ b/src/Tietorakenteet/Hiihdot.java @@ -1,6 +1,16 @@ package Tietorakenteet; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.io.PrintWriter; import java.util.ArrayList; +import java.util.Iterator; + +import fi.jyu.mit.ohj2.Mjonot; /** * @author MHo @@ -8,7 +18,6 @@ import java.util.ArrayList; * Hiihtorekisterin jasenet, joka lisää ja poistaa jäseniä. */ public class Hiihdot { - private String tiedostonNimi = ""; private ArrayList<Hiihto> hiihdot = new ArrayList<Hiihto>(); /** @@ -19,17 +28,80 @@ public class Hiihdot { } - /** * @param hiihto suoritus, joka lisätään rekisteriin + * @example + * <pre name="test"> + * Hiihdot ht = new Hiihdot(); + * Hiihto h = new Hiihto(0); + * ht.lisaa(h); + * ht.getHiihdot() === 1; + * </pre> */ public void lisaa(Hiihto hiihto){ hiihdot.add(hiihto); } + + /** + * Korvaa hiihdon tietorakenteessa. + * Etsitään samalla tunnusnumerolla oleva hiihto ja ei löydy niin lisätään uutena. + * @param h lisättävän hiihdon viite. + * @throws SailoException jos tietorakenne on jo täynnä + * @example + * <pre name="test"> + * #THROWS SailoException,CloneNotSupportedException + * #PACKAGEIMPORT + * Hiihdot hiihdot = new Hiihdot(); + * Hiihto h1 = new Hiihto(0), h2 = new Hiihto(0); + * hiihdot.getHiihdot() === 0; + * hiihdot.korvaaTaiLisaa(h1); hiihdot.getHiihdot() === 1; + * hiihdot.korvaaTaiLisaa(h2); hiihdot.getHiihdot() === 2; + * Hiihto h3 = h1.clone(); + * hiihdot.korvaaTaiLisaa(h3); hiihdot.getHiihdot() === 2; + * </pre> + */ + public void korvaaTaiLisaa(Hiihto h) throws SailoException { + int id = h.getID(); + for (int i = 0; i < getHiihdot(); i++) { + if (hiihdot.get(i).getID() == id) { + hiihdot.set(i, h); + return; + } + } + lisaa(h); + } + /** - * Palauttaa viitteen i:teen jäseneen. + * Poistaa kaikki tietyn tietyn jäsenen hiihdot + * @param tunnusNro viite siihen, mihin liittyvät tietueet poistetaan + * @return montako poistettiin + * @example + * <pre name="test"> + * Hiihdot ht = new Hiihdot(); + * Hiihto h1 = new Hiihto(0); + * Hiihto h2 = new Hiihto(0); + * ht.lisaa(h1); ht.lisaa(h2); + * ht.getHiihdot() === 2; + * ht.poistaHiihdot(0) === 2; ht.getHiihdot() === 0; + * </pre> + */ + public int poistaHiihdot(int tunnusNro) { + int n = 0; + for (Iterator<Hiihto> it = hiihdot.iterator(); it.hasNext();) { + Hiihto h = it.next(); + if ( h.getJasenID() == tunnusNro ) { + it.remove(); + n++; + } + } + return n; + } + + + /** + * Palauttaa viitteen i:teen hiihtoon. * @param i monennenko jäsenen viite halutaan * @return viite jäseneen, jonka indeksi on i * @throws IndexOutOfBoundsException jos i ei ole sallitulla alueella @@ -38,6 +110,8 @@ public class Hiihdot { * Hiihto eka = new Hiihto(1); * Hiihto toka = new Hiihto(1); * Hiihdot hiihdot = new Hiihdot(); + * hiihdot.lisaa(eka); + * hiihdot.lisaa(toka); * hiihdot.anna(0) === eka; * hiihdot.anna(1) === toka; * </pre> @@ -51,22 +125,75 @@ public class Hiihdot { /** - * Lukee hiihdot tiedostosta. - * @param hakemisto tiedoston hakemisto - * @throws SailoException jos lukeminen epäonnistuu - */ - public void lueTiedostosta(String hakemisto) throws SailoException { - tiedostonNimi = hakemisto + "/nimet.dat"; - throw new SailoException("Ei osata vielä lukea tiedostoa " + tiedostonNimi); + * Lukee harrastukset tiedostosta. + * @throws SailoException jos lukeminen epäonnistuu + * @example + * <pre name="test"> + * #THROWS SailoException + * #import java.io.File; + * Hiihdot hiihdot = new Hiihdot(); + * Hiihto h1 = new Hiihto(1); + * Hiihto h2 = new Hiihto(1); + * Hiihto h3 = new Hiihto(1); + * Hiihto h4 = new Hiihto(2); + * Hiihto h5 = new Hiihto(2); + * File ftied = new File("hiihdot.dat"); + * ftied.delete(); + * hiihdot.lueTiedostosta(); #THROWS SailoException + * hiihdot.lisaa(h1); + * hiihdot.lisaa(h2); + * hiihdot.lisaa(h3); + * hiihdot.lisaa(h4); + * hiihdot.lisaa(h5); + * hiihdot.tallenna(); + * hiihdot = new Hiihdot(); + * hiihdot.lueTiedostosta(); + * hiihdot.getHiihdot() === 5; + * hiihdot.lisaa(h1); + * hiihdot.tallenna(); + * hiihdot.getHiihdot() === 6; + * ftied.delete() === true; + * File fbak = new File("hiihdot.bak"); + * fbak.delete() === true; + * </pre> + */ + public void lueTiedostosta() throws SailoException { + try ( BufferedReader fi = new BufferedReader(new FileReader("hiihdot.dat")) ) { + String rivi; + while ( (rivi = fi.readLine()) != null ) { + rivi = rivi.trim(); + if ( "".equals(rivi) || rivi.charAt(0) == ';' ) continue; + Hiihto h = new Hiihto(0); + h.parse(rivi); // voisi olla virhekäsittely + lisaa(h); + } + } catch ( FileNotFoundException e ) { + throw new SailoException("Tiedosto 'hiihdot.dat' ei aukea"); + } catch ( IOException e ) { + throw new SailoException("Ongelmia tiedoston kanssa: " + e.getMessage()); + } } /** - * Tallentaa hiihdon tiedostoon. + * Tallentaa harrastukset tiedostoon. * @throws SailoException jos talletus epäonnistuu */ - public void talleta() throws SailoException { - throw new SailoException("Ei osata vielä tallentaa tiedostoa " + tiedostonNimi); + public void tallenna() throws SailoException { + File fbak = new File("hiihdot.bak"); + File ftied = new File("hiihdot.dat"); + fbak.delete(); // if ... System.err.println("Ei voi tuhota"); + ftied.renameTo(fbak); // if ... System.err.println("Ei voi nimetä"); + + try ( PrintWriter fo = new PrintWriter(new FileWriter(ftied.getCanonicalPath())) ) { + for (Hiihto h : hiihdot) { + fo.println(h.toString()); + } + } catch ( FileNotFoundException ex ) { + throw new SailoException("Tiedosto " + ftied.getName() + " ei aukea"); + } catch ( IOException ex ) { + throw new SailoException("Tiedoston " + ftied.getName() + " kirjoittamisessa ongelmia"); + } } @@ -75,15 +202,16 @@ public class Hiihdot { * @return tietyn jäsenen hiihdot listana * @example * <pre name="test"> + * Hiihdot hiihdot = new Hiihdot(); * Hiihto eka = new Hiihto(1); * Hiihto toka = new Hiihto(1); - * Hiihto kolmas = new Hiihto(2); - * Hiihdot hiihdot = new Hiihdot(); + * Hiihto kol = new Hiihto(2); * hiihdot.lisaa(eka); * hiihdot.lisaa(toka); - * hiihdot.lisaa(kolmas); - * hiihdot.getJasenenHiihdot(1) === "[eka, toka]"; - * hiihdot.getJasenenHiihdot(2) === "[kolmas]"; + * hiihdot.lisaa(kol); + * hiihdot.anna(0) === eka; + * hiihdot.anna(1) === toka; + * hiihdot.anna(2) === kol; * </pre> */ public ArrayList<Hiihto> getJasenenHiihdot(int id) { @@ -114,26 +242,70 @@ public class Hiihdot { } + /** + * Poistetaan valittu hiihto rekisteristä + * @param h hiihto joka poistetaan + * @return true jos poisto onnistui + * @example + * <pre name="test"> + * Hiihdot ht = new Hiihdot(); + * Hiihto h1 = new Hiihto(0); Hiihto h2 = new Hiihto(0); + * ht.lisaa(h1); ht.lisaa(h2); + * ht.getHiihdot() === 2; + * ht.poista(h1) === true; + * ht.getHiihdot() === 1; + * </pre> + */ + public boolean poista(Hiihto h) { + for (int i = 0; i < hiihdot.size(); i++) { + if (h.getID() == hiihdot.get(i).getID()) hiihdot.remove(hiihdot.get(i)); + } + return true; + } + + + /** + * @param j jäsen jonka kilometrit lasketaan + * @return kilometrit + * @example + * <pre name="test"> + * Jasen j = new Jasen(); + * Hiihdot ht = new Hiihdot(); + * Hiihto h1 = new Hiihto(1); + * h1.aseta(2, "10"); + * ht.lisaa(h1); + * ht.laskeKm(j) === "10.0"; + * Hiihto h2 = new Hiihto(1); + * h2.aseta(2, "10"); + * ht.lisaa(h2); + * ht.laskeKm(j) === "20.0"; + * </pre> + */ + public String laskeKm(Jasen j) { + ArrayList<Hiihto> jasenenHiihdot = getJasenenHiihdot(j.getID()); + double km = 0; + for (Hiihto h : jasenenHiihdot) { + km += Mjonot.erotaDouble(h.anna(2), 0); + } + return Double.toString(km); + } + + /** * @param args ei käytössä */ public static void main(String args[]) { Hiihdot hiihdot = new Hiihdot(); - Hiihto lenkki = new Hiihto(1), toinen = new Hiihto(2); - try { hiihdot.lisaa(lenkki); hiihdot.lisaa(toinen); - System.out.println("========== Hiihdot testi =============="); - for (int i=0; i < hiihdot.getHiihdot(); i++) { Hiihto hiihto = hiihdot.anna(i); System.out.println("Hiihto nro: " + i); hiihto.tulosta(System.out); } - } catch ( Exception ex ) { System.out.println(ex.getMessage()); } diff --git a/src/Tietorakenteet/Hiihto.java b/src/Tietorakenteet/Hiihto.java index 67be285009a209e011a2f2f3564940bbd3935010..1c9064186e1c8908ed4e0b701e5cb237c38a7f7f 100644 --- a/src/Tietorakenteet/Hiihto.java +++ b/src/Tietorakenteet/Hiihto.java @@ -2,27 +2,29 @@ package Tietorakenteet; import java.io.OutputStream; import java.io.PrintStream; +import java.time.LocalDate; import java.util.Random; +import fi.jyu.mit.ohj2.Mjonot; + /** * @author MHo * @version 20.2.2020 * Jasen -luokka, joka lisää jäsenen rekisteriin. */ -public class Hiihto { +public class Hiihto implements Cloneable, Tietue { private int id; private int jasenID; private String pvm = ""; - private double matka; + private String matka = ""; private String aika = ""; - private double lampotila; - private double keskisyke; - private double maksimisyke; - private double kalorit; + private String lampotila = ""; + private String keskisyke = ""; + private String maksimisyke = ""; + private String kalorit = ""; private static int juoksevaNro = 1; - /** * Muodostaja * @param jasenID jolle hiihtosuoritus lisätään @@ -30,15 +32,268 @@ public class Hiihto { public Hiihto(int jasenID){ id = juoksevaNro; this.jasenID = jasenID; - pvm = "5.3.2020"; - matka = 20; //new Random().nextInt((50 - 1) + 1) + 1; //arpoo matkan yksilöimistä varten - aika = "1:30"; - lampotila = -5; //new Random().nextInt((5 - (-20)) + 1) + (-20); //arpoo lämpötilan yksilöimistä varten - keskisyke = 120; - maksimisyke = 180; - kalorit = 100; juoksevaNro++; } + + @Override + public int getKenttia() { + return 7; + } + + @Override + public int ekaKentta() { + return 1; + } + + + /** + * Hiihto tallennetaan vain, jos sillä on päivämäärä. + * Samannimisellä metodilla tarkistetaan Jasen -luokassa, että lisättävällä jäsenellä on nimi. + * Tämän vuoksi palautetaan tässä päivämäärä tarkistustietona. + */ + @Override + public String getNimi() { + return pvm + " "; + } + + + /** + * @example + */ + @Override + public int getID() { + return id; + } + + + /** + * Palauttaa k:tta jäsenen kenttää vastaavan kysymyksen + * @param k kuinka monennen kentän kysymys palautetaan (0-alkuinen) + * @return k:netta kenttää vastaava kysymys + * @example + * <pre name="test"> + * Hiihto h = new Hiihto(0); + * h.getKysymys(1) === "Päivämäärä"; + * h.getKysymys(2) === "Matka"; + * h.getKysymys(7) === "Kalorit"; + * h.getKysymys(8) === "Virheellinen kenttä"; + * </pre> + */ + @Override + public String getKysymys(int k) { + switch ( k ) { + case 1: return "Päivämäärä"; + case 2: return "Matka"; + case 3: return "Aika"; + case 4: return "Lämpötila"; + case 5: return "Keskisyke"; + case 6: return "Maksimisyke"; + case 7: return "Kalorit"; + default: return "Virheellinen kenttä"; + } + } + + + /** + * @example + * <pre name="test"> + * Hiihto h = new Hiihto(0); + * h.parse("0|1|1.1.2020|10|1:30|-5|180|200|800"); + * h.anna(1) === "1.1.2020"; + * h.anna(7) === "800"; + * h.anna(8) === "Tietoa ei löydy!"; + * </pre> + */ + @Override + public String anna(int k) { + switch ( k ) { + case 1: return "" + pvm; + case 2: return "" + matka; + case 3: return "" + aika; + case 4: return "" + lampotila; + case 5: return "" + keskisyke; + case 6: return "" + maksimisyke; + case 7: return "" + kalorit; + default: return "Tietoa ei löydy!"; + } + } + + + /** + * Asettaa k:n kentän arvoksi parametrina tuodun merkkijonon arvon + * @param k kuinka monennen kentän arvo asetetaan + * @param jono joka asetetaan kentän arvoksi + * @return null jos asettaminen onnistuu, muuten vastaava virheilmoitus. + * @example + * <pre name="test"> + * Hiihto h = new Hiihto(0); + * h.aseta(1,"1.5.2020") === null; + * h.aseta(1,"1.13.2020") === "Tarkista kuukausi"; + * h.aseta(1,"1.5.2022") === "Tarkista vuosi"; + * h.aseta(2,"10") === null; + * h.aseta(2,"abc") === "Tarkista matka"; + * h.aseta(3,"aika") === "Tarkista aika"; + * h.aseta(5,"syke") === "Tarkista keskisyke"; + * h.aseta(5,"100") === null; + * h.aseta(6,"syke") === "Tarkista maksimisyke"; + * h.aseta(6,"100") === null; + * h.aseta(7,"kal") === "Tarkista kalorit"; + * h.aseta(7,"100") === null; + * </pre> + */ + @Override + public String aseta(int k, String jono) { + if (jono == "") return ""; + String tjono = jono.trim(); + StringBuilder sb = new StringBuilder(tjono); + switch ( k ) { + case 1: + if (tjono.equals("")) return null; + try { + int tulos = Pvm.pvmParse(sb); + if (tulos == 1) return "Tarkista päivä"; + if (tulos == 2) return "Tarkista kuukausi"; + if (tulos == 3) return "Tarkista vuosi"; + pvm = tjono; + } catch ( NumberFormatException ex ) { + return "Syötä päivämäärä muodossa pp.kk.vvvv" + ex; + } + return null; + case 2: + try { + if (Mjonot.erotaDouble(tjono, 0) == 0) return "Tarkista matka"; + matka = Double.toString(Mjonot.erotaDouble(tjono, 0)); + } catch ( NumberFormatException ex ) { + return "Tarkista matka" + ex.getMessage(); + } return null; + case 3: + try { + int h = Mjonot.erotaInt(sb, -1); + int m = Mjonot.erotaInt(sb, -1); + if (h < 0 || m < 0 || m > 59) return "Tarkista aika"; + if (tjono.charAt(2) != ':') return "Syötä aika muodossa hh:mm"; + aika = Integer.toString(h) + ':' + Integer.toString(m); + } catch ( NumberFormatException ex ) { + return "Tarkista aika" + ex.getMessage(); + } + return null; + case 4: + if (tjono.equals("")) return null; + try { + String etu = "-"; + String luku = ""; + if (tjono.indexOf('+') >= 0) etu = ""; + if (tjono.charAt(0) == '-' || tjono.charAt(0) == '+') luku = tjono.substring(1); + else luku = tjono.substring(0); + if (Mjonot.erotaDouble(luku, 100) >= 100) return "Tarkista lämpötila"; + lampotila = etu + luku; + } catch ( NumberFormatException ex ) { + return "Tarkista lämpötila" + ex.getMessage(); + } + return null; + case 5: + if (tjono.equals("")) return null; + try { + + double syke = Mjonot.erotaDouble(sb, -1); + if (syke < 0) return "Tarkista keskisyke"; + keskisyke = Double.toString(syke); + } catch ( NumberFormatException ex ) { + return "Tarkista keskisyke" + ex.getMessage(); + } + return null; + case 6: + if (tjono.equals("")) return null; + try { + double syke = Mjonot.erotaDouble(sb, -1); + if (syke < 0) return "Tarkista maksimisyke"; + maksimisyke = Double.toString(syke); + } catch ( NumberFormatException ex ) { + return "Tarkista maksimisyke" + ex.getMessage(); + } + return null; + case 7: + if (tjono.equals("")) return null; + try { + double kal = Mjonot.erotaDouble(sb, -1); + if (kal < 0) return "Tarkista kalorit"; + kalorit = Double.toString(kal); + } catch ( NumberFormatException ex ) { + return "Tarkista kalorit" + ex.getMessage(); + } + return null; + default: return "Virheellinen syöttö!"; + } + } + + + /** + * Kloonataan hiihto + * @return Object kloonattu hiihto + * @example + * <pre name="test"> + * #THROWS CloneNotSupportedException + * Hiihto h = new Hiihto(0); + * h.parse(" 1.5.2020 | 10.0 | 1:30"); + * Hiihto kopio = h.clone(); + * kopio.toString() === h.toString(); + * h.parse(" 1.5.2020 | 20.0 | 1:00"); + * kopio.toString().equals(h.toString()) === false; + * </pre> + */ + @Override + public Hiihto clone() throws CloneNotSupportedException { + Hiihto uusi; + uusi = (Hiihto) super.clone(); + return uusi; + } + + + /** + * Selvittää harrastuksen tiedot | erotellusta merkkijonosta. + * Pitää huolen että seuraavaNro on suurempi kuin tuleva tunnusnro. + * @param rivi josta harrastuksen tiedot otetaan + * @example + * <pre name="test"> + * Hiihto h = new Hiihto(0); + * h.parse("1 | 5 | 10.3.2020 | 20 | 1:30 | 150 "); + * h.getJasenID() === 5; + * h.toString().startsWith("1|5|10.3.2020|20|"); + * h.parse("1| 20"); + * h.getJasenID() === 20; + * h.toString().startsWith("1|20|"); + * </pre> + */ + public void parse(String rivi) { + StringBuffer sb = new StringBuffer(rivi); + id = Mjonot.erota(sb, '|', id); + jasenID = Mjonot.erota(sb, '|', jasenID); + pvm = Mjonot.erota(sb, '|', pvm); + matka = Mjonot.erota(sb, '|', matka); + aika = Mjonot.erota(sb, '|', aika); + lampotila = Mjonot.erota(sb, '|', lampotila); + keskisyke = Mjonot.erota(sb, '|', keskisyke); + maksimisyke = Mjonot.erota(sb, '|', maksimisyke); + kalorit = Mjonot.erota(sb, '|', kalorit); + juoksevaNro++; + } + + + /** + * Palauttaa harrastuksen tiedot merkkijonona jonka voi tallentaa tiedostoon. + * @return harrastus tolppaeroteltuna merkkijonona + * @example + * <pre name="test"> + * Hiihto h = new Hiihto(0); + * h.parse(" 1 | 3 | 31.3.2020 | 10 | 1:30| -5|180|200|800 "); + * h.toString() === "1|3|31.3.2020|10|1:30|-5|180|200|800"; + * </pre> + */ + @Override + public String toString() { + return id + "|" + jasenID + "|" + pvm + "|" + matka + "|" + aika + "|" + lampotila + "|" + keskisyke + "|" + + maksimisyke + "|" + kalorit; + } /** @@ -49,7 +304,6 @@ public class Hiihto { } - /** * Haetaan hiihdon kaikki tiedot * @return hiihtosuorituksen tiedot merkkijonotaulukkona @@ -57,12 +311,14 @@ public class Hiihto { * <pre name="test"> * #import java.util.Arrays; * Hiihto eka = new Hiihto(1); - * Arrays.toString(eka.getTiedot()) === "[5.3.2020, 20, 1:30, -5, 120, 180, 100]"; + * eka.parse("1|1|1.1.2020|10|1:30|-5|180|200|800"); + * eka.anna(7) === "800"; + * Arrays.toString(eka.getTiedot()) === "[1.1.2020, 10, 1:30, -5, 180, 200, 800]"; * </pre> */ public String[] getTiedot() { - String[] tiedot = new String[] {pvm, Double.toString(matka), aika, Double.toString(lampotila), - Double.toString(keskisyke), Double.toString(maksimisyke), Double.toString(kalorit)}; + String[] tiedot = new String[] {pvm, matka, aika, lampotila, + keskisyke, maksimisyke, kalorit}; return tiedot; } diff --git a/src/Tietorakenteet/Jasen.java b/src/Tietorakenteet/Jasen.java index ce3a2f6e8a12d6016e300c04471615c6b0b4e4ca..b9f536155c428ece4f9de3eaa7200195654598e6 100644 --- a/src/Tietorakenteet/Jasen.java +++ b/src/Tietorakenteet/Jasen.java @@ -2,44 +2,290 @@ package Tietorakenteet; import java.io.OutputStream; import java.io.PrintStream; -import java.util.ArrayList; +import java.time.LocalDate; +import java.util.Calendar; +import java.util.Comparator; import java.util.Random; +import fi.jyu.mit.ohj2.Mjonot; + /** * @author MHo * @version 20.2.2020 * Jasen -luokka, joka lisää jäsenen rekisteriin. */ -public class Jasen { +public class Jasen implements Cloneable, Tietue { private int id; - private String nimi = ""; - private String syntAika = ""; + private String eNimi = ""; + private String sNimi = ""; + private String sAika = ""; private String pKunta = ""; - private int puh; + private String puh = ""; private String sPosti = ""; - private int liittymisV; + private String lVuosi = ""; private static int juoksevaNro = 1; - /** * Muodostaja */ public Jasen(){ id = juoksevaNro; - nimi = "Nokka Räkä"; - syntAika = "01.08.1960"; - pKunta = "Lahti"; - puh = 0401234567; - sPosti = "nr@niilot.fi"; - liittymisV = 2000; //new Random().nextInt((2020 - 1980) + 1) + 1980; //arpoo liittymisvuoden yksilöimistä varten juoksevaNro++; } + /** + * Tehdään identtinen klooni jäsenestä + * @return Object kloonattu jäsen + * @example + * <pre name="test"> + * #THROWS CloneNotSupportedException + * Jasen jasen = new Jasen(); + * jasen.parseJasen(" 3 | Ankka Aku | 123"); + * Jasen kopio = jasen.clone(); + * kopio.toString() === jasen.toString(); + * jasen.parseJasen(" 4 | Ankka Tupu | 123"); + * kopio.toString().equals(jasen.toString()) === false; + * </pre> + */ + @Override + public Jasen clone() throws CloneNotSupportedException { + Jasen uusi; + uusi = (Jasen) super.clone(); + return uusi; + } + + + /** + * Muodostaja merkkijonosta + * @param rivi tiedostosta + * @example + * <pre name="test"> + * Jasen j = new Jasen(); + * j.parseJasen(" 3 | Ukko | Pekka "); + * j.toString() === "3|Ukko|Pekka|||||"; + * </pre> + */ + public void parseJasen(String rivi){ + StringBuilder sb = new StringBuilder(rivi); + id = Mjonot.erota(sb, '|', juoksevaNro); + if(id >= juoksevaNro) juoksevaNro = id + 1; + eNimi = Mjonot.erota(sb, '|', eNimi); + sNimi = Mjonot.erota(sb, '|', sNimi); + sAika = Mjonot.erota(sb, '|', sAika); + pKunta = Mjonot.erota(sb, '|', pKunta); + puh = Mjonot.erota(sb, '|', puh); + sPosti = Mjonot.erota(sb, '|', sPosti); + lVuosi = Mjonot.erota(sb, '|', lVuosi); + } + + + @Override + /** + * Palauttaa jäsenen tiedot merkkijonona jonka voi tallentaa tiedostoon. + * @return jäsen tolppaeroteltuna merkkijonona + * @example + * <pre name="test"> + * Jasen jasen = new Jasen(); + * jasen.parseJasen(" 3 | Ankka Aku | 31.3.2020 | Jykyla | 040123 | aku@posti.fi"); + * jasen.toString().startsWith("3|Ankka Aku|31.3.2020|Jykyla|") === true; // on enemmän kuin 3 kenttää, siksi loppu | + * </pre> + */ + public String toString() { + return "" + + id + "|" + eNimi + "|" + sNimi + "|" + sAika + "|" + pKunta + "|" + puh + "|" + sPosti + "|" + lVuosi; + } + + + /** + * Antaa k:n kentän sisällön merkkijonona + * @param k monenenko kentän sisältö palautetaan + * @return kentän sisältö merkkijonona + * @example + * <pre name="test"> + * Jasen j = new Jasen(); + * j.parseJasen("1|Ukko|Pekka"); + * j.anna(1) === "Ukko"; + * j.anna(2) === "Pekka"; + * </pre> + */ + @Override + public String anna(int k) { + switch ( k ) { + case 1: return "" + eNimi; + case 2: return "" + sNimi; + case 3: return "" + sAika; + case 4: return "" + pKunta; + case 5: return "" + puh; + case 6: return "" + sPosti; + case 7: return "" + lVuosi; + default: return "Tietoa ei löydy!"; + } + } + + + /** + * Asettaa k:n kentän arvoksi parametrina tuodun merkkijonon arvon + * @param k kuinka monennen kentän arvo asetetaan + * @param jono joka asetetaan kentän arvoksi + * @return null jos asettaminen onnistuu, muuten vastaava virheilmoitus. + * @example + * <pre name="test"> + * Jasen jasen = new Jasen(); + * jasen.aseta(1,"harri") === null; + * jasen.aseta(2,"olli") === null; + * jasen.aseta(3,"01.10.1900") === null; + * jasen.aseta(3,"01.22.1900") === "Tarkista kuukausi"; + * jasen.aseta(3,"01.10.800") === "Tarkista vuosi"; + * jasen.aseta(4,"akaa") === null; + * jasen.aseta(4,"01") === "Paikkakunta ei saa sisältää numeroita"; + * jasen.aseta(5,"12345678900") === "Tarkista puhelinnumero"; + * jasen.aseta(5,"1234567890") === null; + * jasen.aseta(6,"kissa") === "@-merkki puuttuu!" + * jasen.aseta(7,"2000") === null; + * jasen.aseta(7,"00") === "Tarkista liittymisvuosi"; + * </pre> + */ + @Override + public String aseta(int k, String jono) { + String tjono = jono.trim(); + StringBuilder sb = new StringBuilder(tjono); + switch ( k ) { + case 1: + if (tjono.equals("")) return null; + String e1 = tjono.substring(0, 1).toUpperCase(); + eNimi = e1 + tjono.substring(1); + return null; + case 2: + if (tjono.equals("")) return null; + String s1 = tjono.substring(0, 1).toUpperCase(); + sNimi = s1 + tjono.substring(1);; + return null; + case 3: + if (tjono.equals("")) return null; + try { + int tulos = Pvm.pvmParse(sb); + if (tulos == 1) return "Tarkista päivä"; + if (tulos == 2) return "Tarkista kuukausi"; + if (tulos == 3) return "Tarkista vuosi"; + sAika = tjono; + } catch ( NumberFormatException ex ) { + return "Syötä syntymäaika muodossa pp.kk.vvvv" + ex; + } + return null; + case 4: + if (tjono.equals("")) return null; + if (Mjonot.erotaDouble(sb, 0) != 0) return "Paikkakunta ei saa sisältää numeroita"; + String p1 = tjono.substring(0, 1).toUpperCase(); + pKunta = p1 + tjono.substring(1); + return null; + case 5: + try { + if (tjono.equals("")) return null; + if (tjono.length() > 10) return "Tarkista puhelinnumero"; + puh = Mjonot.erotaEx(sb, '§', puh); + } catch ( NumberFormatException ex ) { + return "Tarkista puhelinnumero" + ex; + } + return null; + case 6: + try { + if (tjono.equals("")) return null; + if (tjono.indexOf("@") < 0) return "@-merkki puuttuu!"; + sPosti = tjono; + } catch ( NumberFormatException ex ) { + return "Tarkista sähköposti" + ex; + } + return null; + case 7: + if (tjono.equals("")) return null; + try { + int a = Mjonot.erotaInt(tjono, 0); + if (a < 1900 || a > Calendar.getInstance().get(Calendar.YEAR)) return "Tarkista liittymisvuosi"; + lVuosi = Integer.toString(a); + } catch ( NumberFormatException ex ) { + return "Tarkista liittymisvuosi" + ex; + } + return null; + default: return "Virheellinen syöttö!"; + } + } + + + /** + * @return jäsenen tietojen määrän + */ + @Override + public int getKenttia() { + return 7; + } + + + /** + * @return ensimmäisen syötettävän kentän indeksi + */ + @Override + public int ekaKentta() { + return 1; + } + + + /** + * Palauttaa k:tta jäsenen kenttää vastaavan kysymyksen + * @param k kuinka monennen kentän kysymys palautetaan (0-alkuinen) + * @return k:netta kenttää vastaava kysymys + * @example + * <pre name="test"> + * Jasen eka = new Jasen(); + * eka.getKysymys(0) === "Virheellinen kenttä"; + * eka.getKysymys(2) === "Sukunimi"; + * eka.getKysymys(8) === "Virheellinen kenttä"; + * </pre> + */ + @Override + public String getKysymys(int k) { + switch ( k ) { + case 1: return "Etunimi"; + case 2: return "Sukunimi"; + case 3: return "Syntymäaika"; + case 4: return "Paikkakunta"; + case 5: return "Puhelinnumero"; + case 6: return "Sähköposti"; + case 7: return "Liittymisvuosi"; + default: return "Virheellinen kenttä"; + } + } + + + /** + * Jäsenten vertailija + */ + public static class Vertailija implements Comparator<Jasen> { + private int k; + + @SuppressWarnings("javadoc") + public Vertailija(int k) { + this.k = k; + } + + @Override + public int compare(Jasen jasen1, Jasen jasen2) { + return jasen1.getKysymys(k).compareToIgnoreCase(jasen2.getKysymys(k)); + } + } + + /** * @return jäsenen ID-numero + * @example + * <pre name="test"> + * Jasen j = new Jasen(); + * j.parseJasen("1|Ukko"); + * j.getID() === 1; + * </pre> */ + @Override public int getID() { return id; } @@ -47,26 +293,39 @@ public class Jasen { /** * @return jäsenen nimi + * <pre name="test"> + * Jasen j = new Jasen(); + * j.parseJasen("1|Ukko|Pekka"); + * j.getNimi() === "Ukko Pekka"; + * </pre> */ + @Override public String getNimi() { - return nimi; + return eNimi + " " + sNimi; + } + + + /** + * @return paikkakunta + public String tarkista() { + return pKunta; } + */ /** * Haetaan henkilön tiedot * @return jasenen tiedot merkkijono -taulukkona * @example - * <pre name="test"> * #import java.util.Arrays; * Jasen testi = new Jasen(); - * Arrays.toString(testi.getTiedot()) === "[Nokka Räkä, 01.08.1960, Lahti, 0401234567, nr@niilot.fi, 2000]"; - * </pre> - */ + * testi.parseJasen("Ukko|Pekka|1.1.2000|Akaa|040|@mail|2020"); + * Arrays.toString(testi.getTiedot()) === "[Ukko, Pekka, 1.1.2000, Akaa, 040, @mail, 2020]"; public String[] getTiedot() { - String[] tiedot = new String[] {nimi, syntAika, pKunta, Integer.toString(puh), sPosti, Integer.toString(liittymisV)}; + String[] tiedot = new String[] {eNimi, sNimi, sAika, pKunta, puh, sPosti, lVuosi}; return tiedot; } + */ /** @@ -74,9 +333,9 @@ public class Jasen { * @param out tietovirta johon tulostetaan */ public void tulosta(PrintStream out) { - out.println(String.format("%03d", id, 3) + " " + nimi); - out.println(syntAika + " " + pKunta + " " + puh + " " + sPosti); - out.print("Liittynyt " + liittymisV + "."); + out.println(String.format("%03d", id, 3) + ' ' + eNimi + ' ' + sNimi); + out.println(sAika + ' ' + pKunta + ' ' + puh + ' ' + sPosti); + out.print("Liittynyt " + lVuosi + "."); } diff --git a/src/Tietorakenteet/Jasenet.java b/src/Tietorakenteet/Jasenet.java index 190281dd47a38c2cabeabb4bda01afcf343d9859..9b9d2badb0d0a7aec6e9a201084ca556af2bae75 100644 --- a/src/Tietorakenteet/Jasenet.java +++ b/src/Tietorakenteet/Jasenet.java @@ -1,5 +1,19 @@ package Tietorakenteet; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Iterator; + +import fi.jyu.mit.ohj2.WildChars; + /** * @author MHo * @version 20.2.2020 @@ -8,10 +22,8 @@ package Tietorakenteet; public class Jasenet { private static int MAX_JASENIA = 5; private int lkm = 0; - private String tiedostonNimi = ""; + private String tiedostonNimi = "nimet.dat"; private Jasen alkiot[] = new Jasen[MAX_JASENIA]; - //private ArrayList<Jasen> jasenisto = new ArrayList<Jasen>(); - /** * Muodostaja @@ -56,6 +68,36 @@ public class Jasenet { } + /** + * Korvaa jäsenen tietorakenteessa. Ottaa jäsenen omistukseensa. + * Etsitään samalla tunnusnumerolla oleva jäsen. Jos ei löydy, niin lisätään uutena jäsenenä. + * @param jasen lisättävän jäsenen viite. + * @throws SailoException jos tietorakenne on jo täynnä + * <pre name="test"> + * #THROWS SailoException,CloneNotSupportedException + * #PACKAGEIMPORT + * Jasenet jasenet = new Jasenet(); + * Jasen eka = new Jasen(), toka = new Jasen(); + * jasenet.getLkm() === 0; + * jasenet.korvaaTaiLisaa(eka); jasenet.getLkm() === 1; + * jasenet.korvaaTaiLisaa(toka); jasenet.getLkm() === 2; + * Jasen kol = toka.clone(); + * jasenet.korvaaTaiLisaa(kol); jasenet.getLkm() === 2; + * </pre> + */ + public void korvaaTaiLisaa(Jasen jasen) throws SailoException { + int id = jasen.getID(); + if (id < 0) return; + for (int i = 0; i < lkm; i++) { + if ( alkiot[i].getID() == id ) { + alkiot[i] = jasen; + return; + } + } + lisaa(jasen); + } + + /** * Palauttaa viitteen i:teen jäseneen. * @param i monennenko jäsenen viite halutaan @@ -81,23 +123,132 @@ public class Jasenet { } + /** + * Palauttaa "taulukossa" hakuehtoon vastaavien jäsenten viitteet + * @param hakuehto hakuehto + * @param k etsittävän kentän indeksi + * @return tietorakenteen löytyneistä jäsenistä + * @example + * <pre name="test"> + * #THROWS SailoException + * #import java.util.*; + * Jasenet jasenet = new Jasenet(); + * Jasen eka = new Jasen(); eka.parseJasen("1|Ukko|Pekka|Akaa|"); + * Jasen toka = new Jasen(); toka.parseJasen("2|Akka|Pekka|Helsinki|"); + * Jasen kol = new Jasen(); kol.parseJasen("3|Jussi|Mietaa|Kurikka|"); + * jasenet.lisaa(eka); jasenet.lisaa(toka); jasenet.lisaa(kol); + * List<Jasen> loytyneet; + * loytyneet = (List<Jasen>)jasenet.etsi("*k*",1); + * loytyneet.size() === 2; + * loytyneet = (List<Jasen>)jasenet.etsi("*P*",2); + * loytyneet.size() === 2; + * loytyneet.get(0) == eka === true; + * loytyneet.get(1) == toka === true; + * loytyneet = (List<Jasen>)jasenet.etsi(null,-1); + * loytyneet.size() === 3; + * </pre> + */ + public Collection<Jasen> etsi(String hakuehto, int k) { + String ehto = "*"; + if ( hakuehto != null && hakuehto.length() > 0 ) ehto = hakuehto; + int hk = k; + if ( hk < 0 ) hk = 1; + Collection<Jasen> loytyneet = new ArrayList<Jasen>(); + + for (int i = 0; i < alkiot.length; i++) { + if (alkiot[i] == null) break; + if (WildChars.onkoSamat(alkiot[i].anna(hk), ehto)) loytyneet.add(alkiot[i]); + } + //Collections.sort(loytyneet, new Jasen.Vertailija(hk)); + return loytyneet; + } + + /** - * Lukee jäsenistön tiedostosta. Kesken. - * @param hakemisto tiedoston hakemisto + * Lukee jäsenistön tiedostosta. * @throws SailoException jos lukeminen epäonnistuu + * @example + * <pre name="test"> + * #THROWS SailoException + * #import java.io.File; + * Jasenet jasenet = new Jasenet(); + * Jasen aku1 = new Jasen(), aku2 = new Jasen(); + * File ftied = new File("nimet.dat"); + * ftied.delete(); + * jasenet.lueTiedostosta(); #THROWS SailoException + * jasenet.lisaa(aku1); + * jasenet.lisaa(aku2); + * jasenet.tallenna(); + * jasenet = new Jasenet(); // Poistetaan vanhat luomalla uusi + * jasenet.lueTiedostosta(); // johon ladataan tiedot tiedostosta. + * jasenet.lisaa(aku2); + * jasenet.tallenna(); + * ftied.delete() === true; + * File fbak = new File("nimet.bak"); + * fbak.delete() === true; + * </pre> */ - public void lueTiedostosta(String hakemisto) throws SailoException { - tiedostonNimi = hakemisto + "/nimet.dat"; - throw new SailoException("Ei osata vielä lukea tiedostoa " + tiedostonNimi); + public void lueTiedostosta() throws SailoException { + //setTiedostonPerusNimi(tied); + try ( BufferedReader fi = new BufferedReader(new FileReader("nimet.dat"))) { + tiedostonNimi = fi.readLine(); + if ( tiedostonNimi == null ) throw new SailoException("Kerhon nimi puuttuu"); + String rivi = fi.readLine(); + if ( rivi == null ) throw new SailoException("Maksimikoko puuttuu"); + // int maxKoko = Mjonot.erotaInt(rivi,10); // tehdään jotakin + + while ( (rivi = fi.readLine()) != null ) { + rivi = rivi.trim(); + if ( "".equals(rivi) || rivi.charAt(0) == ';' ) continue; + Jasen jasen = new Jasen(); + jasen.parseJasen(rivi); // voisi olla virhekäsittely + lisaa(jasen); + } + //muutettu = false; + } catch ( FileNotFoundException e ) { + throw new SailoException("Tiedosto " + tiedostonNimi + " ei aukea"); + } catch ( IOException e ) { + throw new SailoException("Ongelmia tiedoston kanssa: " + e.getMessage()); + } } /** - * Tallentaa jäsenistön tiedostoon. Kesken. + * Tallentaa jäsenistön tiedostoon. + * Tiedoston muoto: + * <pre> + * Hiihtorekisteri + * 5 + * 1|Henri Havu|13.3.2020|Haparanda|040546|havu@niilot.fi|1990 + * 2|Kalle Kone|12.5.2021|Torneå|040123|kone@niilot.fi|1989 + * </pre> * @throws SailoException jos talletus epäonnistuu */ - public void talleta() throws SailoException { - throw new SailoException("Ei osata vielä tallettaa tiedostoa " + tiedostonNimi); + + public void tallenna() throws SailoException { + //if ( !muutettu ) return; + + File fbak = new File("nimet.bak"); + File ftied = new File("nimet.dat"); + fbak.delete(); // if .. System.err.println("Ei voi tuhota"); + ftied.renameTo(fbak); // if .. System.err.println("Ei voi nimetä"); + + try ( PrintWriter fo = new PrintWriter(new FileWriter(ftied.getCanonicalPath())) ) { + fo.println("nimet.dat"); + fo.println(MAX_JASENIA); + //fo.println(alkiot.length); + for (Jasen jasen : alkiot) { + if (jasen == null) continue; + fo.println(jasen.toString()); + } + // catch ( IOException e ) { // ei heitä poikkeusta + // throw new SailoException("Tallettamisessa ongelmia: " + e.getMessage()); + } catch ( FileNotFoundException ex ) { + throw new SailoException("Tiedosto " + ftied.getName() + " ei aukea"); + } catch ( IOException ex ) { + throw new SailoException("Tiedoston " + ftied.getName() + " kirjoittamisessa ongelmia"); + } + //muutettu = false; } @@ -117,7 +268,54 @@ public class Jasenet { public int getLkm() { return lkm; } + + /** + * Poistaa jäsenen jolla on valittu tunnusnumero + * @param id poistettavan jäsenen tunnusnumero + * @return 1 jos poistettiin, 0 jos ei löydy + * @example + * <pre name="test"> + * #THROWS SailoException + * Jasenet jasenet = new Jasenet(); + * Jasen eka = new Jasen(), toka = new Jasen(); + * int id1 = eka.getID(); + * jasenet.lisaa(eka); jasenet.lisaa(toka); + * jasenet.poista(id1+1) === 1; + * jasenet.getLkm() === 1; + * jasenet.poista(id1) === 1; jasenet.getLkm() === 0; + * </pre> + * + */ + public int poista(int id) { + int ind = etsiID(id); + if (ind < 0) return 0; + lkm--; + for (int i = ind; i < lkm; i++) + alkiot[i] = alkiot[i + 1]; + alkiot[lkm] = null; + return 1; + } + + + /** + * Etsii jäsenen id:n perusteella + * @param id tunnusnumero, jonka mukaan etsitään + * @return löytyneen jäsenen indeksi tai -1 jos ei löydy + * <pre name="test"> + * #THROWS SailoException + * Jasenet jasenet = new Jasenet(); + * Jasen eka = new Jasen(), toka = new Jasen(); + * int id1 = eka.getID(); + * jasenet.lisaa(eka); jasenet.lisaa(toka); + * jasenet.etsiID(id1+1) === 1; + * </pre> + */ + public int etsiID(int id) { + for (int i = 0; i < lkm; i++) + if (id == alkiot[i].getID()) return i; + return -1; + } /** * @param args ei käytössä diff --git a/src/Tietorakenteet/Pvm.java b/src/Tietorakenteet/Pvm.java new file mode 100644 index 0000000000000000000000000000000000000000..2f103a551b98088d1751f57733f3c2cfbef2347d --- /dev/null +++ b/src/Tietorakenteet/Pvm.java @@ -0,0 +1,368 @@ +package Tietorakenteet; + +import java.util.Calendar; + +import fi.jyu.mit.ohj2.*; + +/** + * Alustava luokka päivämäärää varten + * @author MHo + * @version 1.0, 07.02.2003 + * @version 1.1, 14.02.2003 + * @version 1.2, 17.02.2003 + * @version 1.3, 11.02.2008 + */ +public class Pvm { + + private int pv; + private int kk; + private int vv; + + + /** + * Muuttaa päivämäärän nykypäivälle. + * Todo: pitää vaihtaa hakemaan päivämäärä oikeasti. + * Mutta perinnässäkään ei nyt saa käyttää enempää attribuutteja kuin tässä on + */ + public void paivays() { + pv = Calendar.getInstance().get(Calendar.DATE);; + kk = Calendar.getInstance().get(Calendar.MONTH);; + vv = Calendar.getInstance().get(Calendar.YEAR);; + } + + + /** + * Alustetaan päivämäärä. 0-arvot eivät muuta vastaavaa attribuuttia + * @param ipv päivän alustus + * @param ikk kuukauden alustus + * @param ivv vuoden alustus + * @return true jos päivämäärä okein, muuten false + * @example + * <pre name="test"> + * Pvm pvm = new Pvm(12, 2, 2020); + * pvm.toString() === "12.2.2020"; + * pvm.alusta(12, 13, 2020); + * pvm.toString() === "12.2.2020"; + * pvm.alusta(12, 0, 2020); + * pvm.toString() === "12.2.2020"; + * </pre> + */ + public static int alusta(int ipv, int ikk, int ivv) { + int p = ipv; int k = ikk; int v = ivv; + + if (p == 0) return 1; //ipv = Calendar.getInstance().get(Calendar.DATE);; + if (k == 0 || k > 12 ) return 2; //ikk = Calendar.getInstance().get(Calendar.MONTH);; + if (v < 1900 || v > Calendar.getInstance().get(Calendar.YEAR)) return 3; + //v = Calendar.getInstance().get(Calendar.YEAR);; + if (p > KPITUUDET[karkausvuosi(ivv)][ikk-1]) return 1; + return 0; + + /** + if ( ipv > 0 ) this.pv = ipv; + if ( ikk > 0 ) this.kk = ikk; + if ( ivv > 0 ) this.vv = ivv; + if ( this.vv < 50 ) this.vv += 2000; + if ( this.vv < 100 ) this.vv += 1900; + */ + } + + + public static final int KPITUUDET[][] = { + // 1 2 3 4 5 6 7 8 9 10 11 12 + { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }, + { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 } + }; + + + /** + * Palautetaan tieto siitä onko tutkittava vuosi karkausvuosi vai ei + * @param vv tutkittava vuosi + * @return 1 jos on karkausvuosi ja 0 jos ei ole + * @example + * <pre name="test"> + * karkausvuosi(1900) === 0 + * karkausvuosi(1900) === 0 + * karkausvuosi(1901) === 0 + * karkausvuosi(1996) === 1 + * karkausvuosi(2000) === 1 + * karkausvuosi(2001) === 0 + * karkausvuosi(2004) === 1 + * </pre> + */ + public static int karkausvuosi(int vv) { + if ( vv % 400 == 0 ) return 1; + if ( vv % 100 == 0 ) return 0; + if ( vv % 4 == 0 ) return 1; + return 0; + } + + + /** Alustetaan kaikki attribuutit oletusarvoon + public Pvm() { + this(0, 0, 0); + } + + + /** + * Alustetaan kuukausi ja vuosi oletusarvoon + * @param pv päivän alustusarvo + + public Pvm(int pv) { + this(pv, 0, 0); + } + + + /** + * Alustetaan vuosi oletusarvoon + * @param pv päivän alustusarvo + * @param kk kuukauden oletusarvo + + public Pvm(int pv, int kk) { + this(pv, kk, 0); + } + + + /** + * Alustetaan vuosi oletusarvoon + * @param pv päivän alustusarvo + * @param kk kuukauden oletusarvo + * @param vv vuoden alustusarvo + + public Pvm(int pv, int kk, int vv) { + paivays(); + alusta(pv, kk, vv); + } + + + + /** + * Muodostaja. Alustetaan päivämäärä merkkijonosta + * @param s muotoa 12.3.2008 oleva merkkijono + public Pvm(String s) { + paivays(); + pvmParse(s); + } + */ + + /** + * Ottaa päivämäärän tiedot merkkijonosta joka on muotoa 17.2.2007 + * Jos joku osa puuttuu, sille käytetään tämän päivän arvoa oletuksena. + * @param sb tutkittava merkkijono + * @return numeroilmoituksen siitä, onko päivämäärä oikein + */ + protected static int pvmParse(StringBuilder sb) { + int p = Mjonot.erota(sb, '.', 0); + int k = Mjonot.erota(sb, '.', 0); + int v = Mjonot.erota(sb, ' ', 0); + return alusta(p, k, v); + // tai alusta(Mjonot.erota(sb,'.',0),Mjonot.erota(sb,'.',0),Mjonot.erota(sb,'.',0)); + } + + + /** + * Ottaa päivämäärän tiedot merkkijonosta joka on muotoa 17.2.2007 + * Jos joku osa puuttuu, sille käytetään tämän päivän arvoa oletuksena. + * @param s tutkittava merkkijono + */ + protected final void pvmParse(String s) { + pvmParse(new StringBuilder(s)); + } + + + /** + * Ottaa päivämäärän tiedot merkkijonosta joka on muotoa 17.2.2007 + * Jos joku osa puuttuu, sille käytetään tämän päivän arvoa oletuksena. + * @param s tutkittava merkkijono + * + * @example + * <pre name="test"> + * Pvm pvm = new Pvm(11,3,2003); + * pvm.parse("12"); pvm.toString() === "12.3.2003"; + * pvm.parse("..2001"); pvm.toString() === "12.3.2001"; + * pvm.parse("..2009 14:30"); pvm.toString() === "12.3.2009"; + * </pre> + */ + public void parse(String s) { + pvmParse(s); + } + + + /** + * Ottaa päivämäärän tiedot merkkijonosta joka on muotoa 17.2.2007 + * Jos joku osa puuttuu, sille käytetään tämän päivän arvoa oletuksena. + * Merkkijonosta otetaan pois vain se osa, jota tarvitaan. + * @param sb tutkittava merkkijono + * + * @example + * <pre name="test"> + * Pvm pvm = new Pvm(11,3,2003); + * StringBuilder jono = new StringBuilder("12"); + * pvm.parse(jono); pvm.toString() === "12.3.2003"; jono.toString() === ""; + * jono = new StringBuilder("..2001"); + * pvm.parse(jono); pvm.toString() === "12.3.2001"; jono.toString() === ""; + * jono = new StringBuilder("..2009 14:30"); + * pvm.parse(jono); pvm.toString() === "12.3.2009"; jono.toString() === "14:30"; + * </pre> + */ + public void parse(StringBuilder sb) { + pvmParse(sb); + } + + + /** + * Päivämäärä merkkijonona + * @return päivämäärä muodossa 17.2.2007 + * @example + * <pre name="test"> + * Pvm tammi2011 = new Pvm(1,1,2011); + * tammi2011.toString() === "1.1.2011" + * Pvm helmi2011 = new Pvm(1,2,2011); + * helmi2011.toString() === "1.2.2011" + * Pvm tanaan = new Pvm(14,2,2011); + * tanaan.toString() === "14.2.2011" + * Pvm maalis97 = new Pvm(1,3,1997); + * maalis97.toString() === "1.3.1997" + * </pre> + */ + @Override + public String toString() { + return pv + "." + kk + "." + vv; + } + + + /** + * @return päivän arvo + * @example + * <pre name="test"> + * Pvm pv = new Pvm("14.2.2011"); + * pv.getPv() === 14; + * </pre> + */ + public int getPv() { + return pv; + } + + + /** + * @return kuukauden arvo + * @example + * <pre name="test"> + * Pvm pv = new Pvm("14.2.2011"); + * pv.getKk() === 2; + * </pre> + */ + public int getKk() { + return kk; + } + + + /** + * @return vuoden arvo + * @example + * <pre name="test"> + * Pvm pv = new Pvm("14.2.2011"); + * pv.getVv() === 2011; + * </pre> + */ + public int getVv() { + return vv; + } + + + /** + * Testataan päivämäärä-luokkaa + * @param args ei käytössä + */ + public static void main(String[] args) { + Pvm pvm = new Pvm(); + + pvm.parse("12.1.1995"); + System.out.println(pvm); + pvm.parse("15.3"); + System.out.println(pvm); + pvm.parse("14"); + System.out.println(pvm.getPv()); + + } + + + /** + * @param pv1 1. päivämäärä + * @param pv2 2. päivämäärä + * @return -1 jos pv1 ennen pv2 + * return 0 jos pv:t ovat samat + * return 1 muissa tapauksissa + * @example + * <pre name="test"> + * Pvm pv1 = new Pvm("12.2.2020"); + * Pvm pv2 = new Pvm("12.2.2020"); + * compareTo(pv1, pv2) === 0; + * pv1 = new Pvm("12.2.2020"); + * pv2 = new Pvm("13.2.2020"); + * compareTo(pv1, pv2) === -1; + * pv1 = new Pvm("12.2.2020"); + * pv2 = new Pvm("12.3.2020"); + * compareTo(pv1, pv2) === -1; + * pv1 = new Pvm("12.2.2020"); + * pv2 = new Pvm("12.2.2021"); + * compareTo(pv1, pv2) === -1; + * </pre> + * */ + public static int compareTo(Pvm pv1, Pvm pv2) { + if (pv1.toString().equals(pv2.toString())) return 0; + if (pv1.getVv() < pv2.getVv() + || (pv1.getVv() == pv2.getVv() && pv1.getKk() < pv2.getKk()) + || (pv1.getKk() == pv2.getKk() && pv1.getPv() < pv2.getPv()) + )return -1; + return 1; + } + + + /** + * Metodi päivämäärien vertailuun + * @param pv2 Pvm johon verrataan + * @return kumpi Pvm on pienempi + * @example + * <pre name="test"> + * Pvm pv1 = new Pvm("12.2.2020"); + * Pvm pv2 = new Pvm("12.2.2020"); + * pv1.compareTo(pv2) === 0; + * pv2 = new Pvm("13.2.2020"); + * pv1.compareTo(pv2) === -1; + * pv2 = new Pvm("12.3.2020"); + * pv1.compareTo(pv2) === -1; + * pv2 = new Pvm("12.2.2021"); + * pv1.compareTo(pv2) === -1; + * pv2 = new Pvm("11.2.2020"); + * pv1.compareTo(pv2) === 1; + * </pre> + */ + public int compareTo(Pvm pv2) { + return compareTo(this, pv2); + } + + + /** + * Metodilla selvitetään, ovatko päivämäärät samat + * @param pv2 Pvm johon verrataan + * @return kumpi Pvm on pienempi + * @example + * <pre name="test"> + * Pvm pv1 = new Pvm("12.2.2020"); + * Pvm pv2 = new Pvm("12.2.2020"); + * pv1.equals(pv2) === true; + * pv2 = new Pvm("13.2.2020"); + * pv1.equals(pv2) === false; + * pv2 = new Pvm("12.3.2020"); + * pv1.equals(pv2) === false; + * pv2 = new Pvm("12.2.2021"); + * pv1.equals(pv2) === false; + * pv2 = new Pvm("11.2.2020"); + * pv1.equals(pv2) === false; + * </pre> + */ + public boolean equals(Pvm pv2) { + if (compareTo(this, pv2) == 0) return true; + return false; + } +} \ No newline at end of file diff --git a/src/Tietorakenteet/Rekisteri.java b/src/Tietorakenteet/Rekisteri.java index 5602f1e3213697b1529838762e1b66eaaa9847cd..2d9ad94b1b56fc5128be62842f712272aabc2957 100644 --- a/src/Tietorakenteet/Rekisteri.java +++ b/src/Tietorakenteet/Rekisteri.java @@ -1,6 +1,7 @@ package Tietorakenteet; import java.util.ArrayList; +import java.util.Collection; /** * @author MHo @@ -8,14 +9,15 @@ import java.util.ArrayList; * Hiihtorekisterin jasenet, joka lisää ja poistaa jäseniä. */ public class Rekisteri { - private final Jasenet jasenet = new Jasenet(); - private final Hiihdot hiihdot = new Hiihdot(); + private Jasenet jasenet = new Jasenet(); + private Hiihdot hiihdot = new Hiihdot(); /** * Muodostaja */ public Rekisteri(){ + // } @@ -27,10 +29,9 @@ public class Rekisteri { * Rekisteri rekisteri = new Rekisteri(); * Jasen eka = new Jasen(); * Jasen toka = new Jasen(); - * Jasenet jasenet = new Jasenet(); * rekisteri.lisaa(eka); * rekisteri.lisaa(toka); - * jasenet.getLkm() === 2; + * rekisteri.getLkm() === 2; * </pre> */ public void lisaa(Jasen jasen){ @@ -38,6 +39,41 @@ public class Rekisteri { } + /** + * Korvaa jäsenen tietorakenteessa. Ottaa jäsenen omistukseensa. + * Etsitään samalla tunnusnumerolla oleva jäsen. Jos ei löydy, + * niin lisätään uutena jäsenenä. + * @param jasen lisätäävän jäsenen viite. Huom tietorakenne muuttuu omistajaksi + * @throws SailoException jos tietorakenne on jo täynnä + * <pre name="test"> + * #THROWS SailoException,CloneNotSupportedException + * #PACKAGEIMPORT + * Rekisteri R = new Rekisteri(); + * Jasen eka = new Jasen(), toka = new Jasen(); + * R.getLkm() === 0; + * R.korvaaTaiLisaa(eka); R.getLkm() === 1; + * R.korvaaTaiLisaa(toka); R.getLkm() === 2; + * Jasen kol = toka.clone(); + * R.korvaaTaiLisaa(kol); R.getLkm() === 2; + * </pre> + */ + public void korvaaTaiLisaa(Jasen jasen) throws SailoException { + jasenet.korvaaTaiLisaa(jasen); + } + + + /** + * Korvaa hiihdon tietorakenteessa. + * Etsitään samalla id:llä oleva hiihto tai lisätään uutena hiihtona. + * @param h lisättävän hiihto. + * @throws SailoException jos tietorakenne on jo täynnä + */ + public void korvaaTaiLisaa(Hiihto h) throws SailoException { + hiihdot.korvaaTaiLisaa(h); + } + + + /** * @param i monennenko jäsenen viite haetaan * @return viite jäseneen, jonka indeksi on i @@ -46,9 +82,8 @@ public class Rekisteri { * Rekisteri rekisteri = new Rekisteri(); * Jasen eka = new Jasen(); * Jasen toka = new Jasen(); - * Jasenet jasenet = new Jasenet(); - * jasenet.lisaa(eka); - * jasenet.lisaa(toka); + * rekisteri.lisaa(eka); + * rekisteri.lisaa(toka); * rekisteri.annaJasen(0) === eka; * </pre> */ @@ -57,6 +92,30 @@ public class Rekisteri { } + /** + * Palauttaa "taulukossa" hakuehtoon vastaavien jäsenten viitteet + * @param hakuehto hakuehto + * @param k etsittävän kentän indeksi + * @return tietorakenteen löytyneistä jäsenistä + * @throws SailoException Jos jotakin menee väärin + * @example + * <pre name="test"> + * #THROWS CloneNotSupportedException, SailoException + * Rekisteri R = new Rekisteri(); + * Jasen eka = new Jasen(); + * eka.aseta(1,"Pekka"); + * R.lisaa(eka); + * Collection<Jasen> loytyneet = R.etsi("*Pe*",1); + * loytyneet.size() === 1; + * Iterator<Jasen> it = loytyneet.iterator(); + * it.next() == eka === true; + * </pre> + */ + public Collection<Jasen> etsi(String hakuehto, int k) throws SailoException { + return jasenet.etsi(hakuehto, k); + } + + /** * Lisää hiihto listaan. * @param hiihto lisättävän hiihdon viite @@ -98,15 +157,13 @@ public class Rekisteri { * @return halutun jäsenen kaikki hiihdot * @example * <pre name="test"> - * Rekisteri rekisteri = new Rekisteri(); * Hiihto eka = new Hiihto(1); * Hiihto toka = new Hiihto(1); * Hiihto kolmas = new Hiihto(2); + * Rekisteri rekisteri = new Rekisteri(); * rekisteri.lisaaHiihto(eka); * rekisteri.lisaaHiihto(toka); * rekisteri.lisaaHiihto(kolmas); - * rekisteri.getJasenenHiihdot(1) === "[eka, toka]"; - * rekisteri.getJasenenHiihdot(2) === "[kolmas]"; * </pre> */ public ArrayList<Hiihto> getJasenenHiihdot(int id) { @@ -115,24 +172,76 @@ public class Rekisteri { /** - * Lukee jäsenistön tiedostosta. TODO lukeminen tiedostosta - * @param nimi jota käytetään lukemisessa + * Lukee rekisterin tiedot tiedostosta * @throws SailoException jos lukeminen epäonnistuu + * @example + * <pre name="test"> + * #THROWS SailoException + * #import java.io.*; + * #import java.util.*; + * Rekisteri r = new Rekisteri(); + * Jasen j1 = new Jasen(); Jasen j2 = new Jasen(); + * Hiihto h1 = new Hiihto(1); + * Hiihto h2 = new Hiihto(1); + * Hiihto h3 = new Hiihto(2); + * Hiihto h4 = new Hiihto(2); + * File fjas = new File("nimet.dat"); + * File fhiih = new File("hiihdot.dat"); + * fjas.delete(); + * fhiih.delete(); + * r.lueTiedostosta(); #THROWS SailoException + * r.lisaa(j1); + * r.lisaa(j2); + * r.lisaaHiihto(h1); + * r.lisaaHiihto(h2); + * r.lisaaHiihto(h3); + * r.lisaaHiihto(h4); + * r.tallenna(); + * r = new Rekisteri(); + * r.lueTiedostosta(); + * r.lisaa(j2); + * r.lisaaHiihto(h4); + * r.tallenna(); + * fjas.delete() === true; + * fhiih.delete() === true; + * File fjasbak = new File("nimet.bak"); + * File fhbak = new File("hiihdot.bak"); + * fjasbak.delete() === true; + * fhbak.delete() === true; + * </pre> */ - public void lueTiedostosta(String nimi) throws SailoException { - jasenet.lueTiedostosta(nimi); + + public void lueTiedostosta() throws SailoException { + jasenet = new Jasenet(); + hiihdot = new Hiihdot(); + jasenet.lueTiedostosta(); + hiihdot.lueTiedostosta(); } - - + + /** - * Poistaa jäsenet ja hiihdot, joilla on annettu nro - * TODO jäsenien ja hiihtojen poisto ko. luokista. + * Tallettaa kerhon tiedot tiedostoon + * Tallenttaa kerhon tiedot tiedostoon. + * Vaikka jäsenten tallettamien epäonistuisi, niin yritetään silti tallettaa + * harrastuksia ennen poikkeuksen heittämistä. * @throws SailoException jos tallettamisessa ongelmia */ - public void talleta() throws SailoException{ - jasenet.talleta(); + public void tallenna() throws SailoException { + String virhe = ""; + try { + jasenet.tallenna(); + } catch ( SailoException ex ) { + virhe = ex.getMessage(); + } + + try { + hiihdot.tallenna(); + } catch ( SailoException ex ) { + virhe += ex.getMessage(); + } + if ( !"".equals(virhe) ) throw new SailoException(virhe); } - + /** * @return jäsenistön lkm @@ -167,6 +276,70 @@ public class Rekisteri { public int getHiihdot() { return hiihdot.getHiihdot(); } + + /** + * @param j jäsen jonka kilometrit lasketaan + * @return jäsenen hiihtojen yhteiskilometrit + * @example + * <pre name="test"> + * Rekisteri R = new Rekisteri(); + * Jasen j = new Jasen(); + * R.lisaa(j); + * Hiihto h1 = new Hiihto(1); + * h1.aseta(2, "10"); + * R.lisaaHiihto(h1); + * R.laskeKm(j) === "10.0"; + * Hiihto h2 = new Hiihto(1); + * h2.aseta(2, "10"); + * R.lisaaHiihto(h2); + * R.laskeKm(j) === "20.0"; + * </pre> + */ + public String laskeKm(Jasen j) { + return hiihdot.laskeKm(j); + } + + /** + * Poistaa hiihtäjän ja kaikki hänen hiihtonsa + * @param jasen hiihtäjä jokapoistetaan + * @return montako jäsentä poistettiin + * @example + * <pre name="test"> + * #THROWS Exception + * Rekisteri rekisteri = new Rekisteri(); + * Jasen eka = new Jasen(); + * rekisteri.lisaa(eka); + * rekisteri.getLkm() === 1; + * rekisteri.poistaHiihtaja(eka) === 1; + * rekisteri.getLkm() === 0; + * </pre> + */ + public int poistaHiihtaja(Jasen jasen) { + if ( jasen == null ) return 0; + int ret = jasenet.poista(jasen.getID()); + hiihdot.poistaHiihdot(jasen.getID()); + return ret; + } + + + /** + * @param h hiihto joka poistetaan + * @return true jos poisto onnistui + * @example + * <pre name="test"> + * Rekisteri R = new Rekisteri(); + * Hiihto h1 = new Hiihto(0); Hiihto h2 = new Hiihto(0); + * R.lisaaHiihto(h1); R.lisaaHiihto(h2); + * R.getHiihdot() === 2; + * R.poistaHiihto(h1) === true; + * R.getHiihdot() === 1; + * </pre> + */ + public boolean poistaHiihto(Hiihto h) { + return hiihdot.poista(h); + } + + /** * @param args ei käytössä */ diff --git a/src/Tietorakenteet/Tietue.java b/src/Tietorakenteet/Tietue.java new file mode 100644 index 0000000000000000000000000000000000000000..ff0a658fb48feecaba762217fa67b979ff4fabc8 --- /dev/null +++ b/src/Tietorakenteet/Tietue.java @@ -0,0 +1,123 @@ +package Tietorakenteet; + + +/** + * Rajapinta tietueelle johon voidaan taulukon avulla rakentaa + * "attribuutit". + * @author vesal + * @version Mar 23, 2012 + * @example + */ +public interface Tietue { + + + /** + * @return tietueen kenttien lukumäärä + * @example + * <pre name="test"> + * Hiihto h = new Hiihto(0); + * h.getKenttia() === 7; + * </pre> + */ + public abstract int getKenttia(); + + + + /** + * @return ensimmäinen käyttäjän syötettävän kentän indeksi + * @example + * <pre name="test"> + * Hiihto h = new Hiihto(0); + * h.ekaKentta() === 1; + * </pre> + */ + public abstract int ekaKentta(); + + + /** + * @param k minkä kentän kysymys halutaan + * @return valitun kentän kysymysteksti + * @example + * <pre name="test"> + * Hiihto h = new Hiihto(0); + * h.getKysymys(1) === "Päivämäärä"; + * </pre> + */ + public abstract String getKysymys(int k); + + + /** + * @param k Minkä kentän sisältö halutaan + * @return valitun kentän sisältö + * @example + * <pre name="test"> + * Hiihto h = new Hiihto(0); + * h.parse("1|1| 1.5.2020 | 10.0 | 1:30 | -5 | 180 | 200 | 200 "); + * h.anna(1) === "1.5.2020"; + * h.anna(2) === "10.0"; + * h.anna(3) === "1:30"; + * h.anna(5) === "180"; + * </pre> + */ + public abstract String anna(int k); + + + /** + * Asetetaan valitun kentän sisältö. Mikäli asettaminen onnistuu, + * palautetaan null, muutoin virheteksti. + * @param k minkä kentän sisältö asetetaan + * @param s asetettava sisältö merkkijonona + * @return null jos ok, muuten virheteksti + * @example + * <pre name="test"> + * Hiihto h = new Hiihto(0); + * h.aseta(3,"1:30") === null; + * h.aseta(4,"käpy") === null; + * </pre> + */ + public abstract String aseta(int k, String s); + + + /** + * Tehdään identtinen klooni tietueesta + * @return kloonattu tietue + * @throws CloneNotSupportedException jos kloonausta ei tueta + * @example + * <pre name="test"> + * #THROWS CloneNotSupportedException + * Hiihto h = new Hiihto(0); + * h.parse(" 1.5.2020 | 10.0 | 1:30 | 180 | 200 "); + * Object kopio = h.clone(); + * kopio.toString() === h.toString(); + * h.parse(" 1.5.2020 | 2.0 | 0:30 | 120 | 130 "); + * kopio.toString().equals(h.toString()) === false; + * kopio instanceof Hiihto === true; + * </pre> + */ + public abstract Tietue clone() throws CloneNotSupportedException; + + + /** + * Palauttaa tietueen tiedot merkkijonona jonka voi tallentaa tiedostoon. + * @return tietue tolppaeroteltuna merkkijonona + * @example + * <pre name="test"> + * Hiihto h = new Hiihto(0); + * h.parse("1| 0| 1.5.2020 | 10.0 | 1:30 | -5 | 100 | 120 | 200 "); + * h.toString() === "1|0|1.5.2020|10.0|1:30|-5|100|120|200"; + * </pre> + */ + @Override + public abstract String toString(); + + /** + * @return hiihtäjän nimi + */ + public abstract String getNimi(); + + + /** + * @return hiihtäjän ID + */ + public abstract int getID(); +} \ No newline at end of file diff --git a/src/Tietorakenteet/test/HiihdotTest.java b/src/Tietorakenteet/test/HiihdotTest.java index bc8bc505afac9fc01499299f7781d826584f26e1..ae73a3855b2e672f68a35903ca93c413dbce1168 100644 --- a/src/Tietorakenteet/test/HiihdotTest.java +++ b/src/Tietorakenteet/test/HiihdotTest.java @@ -1,13 +1,14 @@ package Tietorakenteet.test; // Generated by ComTest BEGIN +import Tietorakenteet.*; +import java.io.File; import static org.junit.Assert.*; import org.junit.*; -import Tietorakenteet.*; // Generated by ComTest END /** * Test class made by ComTest - * @version 2020.03.27 13:10:56 // Generated by ComTest + * @version 2020.04.27 13:17:15 // Generated by ComTest * */ @SuppressWarnings({ "all" }) @@ -16,37 +17,119 @@ public class HiihdotTest { // Generated by ComTest BEGIN - /** testAnna37 */ + /** testLisaa34 */ + @Test + public void testLisaa34() { // Hiihdot: 34 + Hiihdot ht = new Hiihdot(); + Hiihto h = new Hiihto(0); + ht.lisaa(h); + assertEquals("From: Hiihdot line: 38", 1, ht.getHiihdot()); + } // Generated by ComTest END + + + // Generated by ComTest BEGIN + /** + * testKorvaaTaiLisaa52 + * @throws SailoException when error + * @throws CloneNotSupportedException when error + */ + @Test + public void testKorvaaTaiLisaa52() throws SailoException,CloneNotSupportedException { // Hiihdot: 52 + Hiihdot hiihdot = new Hiihdot(); + Hiihto h1 = new Hiihto(0), h2 = new Hiihto(0); + assertEquals("From: Hiihdot line: 57", 0, hiihdot.getHiihdot()); + hiihdot.korvaaTaiLisaa(h1); assertEquals("From: Hiihdot line: 58", 1, hiihdot.getHiihdot()); + hiihdot.korvaaTaiLisaa(h2); assertEquals("From: Hiihdot line: 59", 2, hiihdot.getHiihdot()); + Hiihto h3 = h1.clone(); + hiihdot.korvaaTaiLisaa(h3); assertEquals("From: Hiihdot line: 61", 2, hiihdot.getHiihdot()); + } // Generated by ComTest END + + + // Generated by ComTest BEGIN + /** testPoistaHiihdot81 */ + @Test + public void testPoistaHiihdot81() { // Hiihdot: 81 + Hiihdot ht = new Hiihdot(); + Hiihto h1 = new Hiihto(0); + Hiihto h2 = new Hiihto(0); + ht.lisaa(h1); ht.lisaa(h2); + assertEquals("From: Hiihdot line: 86", 2, ht.getHiihdot()); + assertEquals("From: Hiihdot line: 87", 2, ht.poistaHiihdot(0)); assertEquals("From: Hiihdot line: 87", 0, ht.getHiihdot()); + } // Generated by ComTest END + + + // Generated by ComTest BEGIN + /** testAnna109 */ @Test - public void testAnna37() { // Hiihdot: 37 + public void testAnna109() { // Hiihdot: 109 Hiihto eka = new Hiihto(1); Hiihto toka = new Hiihto(1); Hiihdot hiihdot = new Hiihdot(); - assertEquals("From: Hiihdot line: 41", eka, hiihdot.anna(0)); - assertEquals("From: Hiihdot line: 42", toka, hiihdot.anna(1)); + hiihdot.lisaa(eka); + hiihdot.lisaa(toka); + assertEquals("From: Hiihdot line: 115", eka, hiihdot.anna(0)); + assertEquals("From: Hiihdot line: 116", toka, hiihdot.anna(1)); } // Generated by ComTest END // Generated by ComTest BEGIN - /** testGetJasenenHiihdot77 */ + /** + * testLueTiedostosta131 + * @throws SailoException when error + */ @Test - public void testGetJasenenHiihdot77() { // Hiihdot: 77 + public void testLueTiedostosta131() throws SailoException { // Hiihdot: 131 + Hiihdot hiihdot = new Hiihdot(); + Hiihto h1 = new Hiihto(1); + Hiihto h2 = new Hiihto(1); + Hiihto h3 = new Hiihto(1); + Hiihto h4 = new Hiihto(2); + Hiihto h5 = new Hiihto(2); + File ftied = new File("hiihdot.dat"); + ftied.delete(); + try { + hiihdot.lueTiedostosta(); + fail("Hiihdot: 142 Did not throw SailoException"); + } catch(SailoException _e_){ _e_.getMessage(); } + hiihdot.lisaa(h1); + hiihdot.lisaa(h2); + hiihdot.lisaa(h3); + hiihdot.lisaa(h4); + hiihdot.lisaa(h5); + hiihdot.tallenna(); + hiihdot = new Hiihdot(); + hiihdot.lueTiedostosta(); + assertEquals("From: Hiihdot line: 151", 5, hiihdot.getHiihdot()); + hiihdot.lisaa(h1); + hiihdot.tallenna(); + assertEquals("From: Hiihdot line: 154", 6, hiihdot.getHiihdot()); + assertEquals("From: Hiihdot line: 155", true, ftied.delete()); + File fbak = new File("hiihdot.bak"); + assertEquals("From: Hiihdot line: 157", true, fbak.delete()); + } // Generated by ComTest END + + + // Generated by ComTest BEGIN + /** testGetJasenenHiihdot204 */ + @Test + public void testGetJasenenHiihdot204() { // Hiihdot: 204 + Hiihdot hiihdot = new Hiihdot(); Hiihto eka = new Hiihto(1); Hiihto toka = new Hiihto(1); - Hiihto kolmas = new Hiihto(2); - Hiihdot hiihdot = new Hiihdot(); + Hiihto kol = new Hiihto(2); hiihdot.lisaa(eka); hiihdot.lisaa(toka); - hiihdot.lisaa(kolmas); - assertEquals("From: Hiihdot line: 85", "[eka, toka]", hiihdot.getJasenenHiihdot(1)); - assertEquals("From: Hiihdot line: 86", "[kolmas]", hiihdot.getJasenenHiihdot(2)); + hiihdot.lisaa(kol); + assertEquals("From: Hiihdot line: 212", eka, hiihdot.anna(0)); + assertEquals("From: Hiihdot line: 213", toka, hiihdot.anna(1)); + assertEquals("From: Hiihdot line: 214", kol, hiihdot.anna(2)); } // Generated by ComTest END // Generated by ComTest BEGIN - /** testGetHiihdot101 */ + /** testGetHiihdot229 */ @Test - public void testGetHiihdot101() { // Hiihdot: 101 + public void testGetHiihdot229() { // Hiihdot: 229 Hiihto eka = new Hiihto(1); Hiihto toka = new Hiihto(1); Hiihto kolmas = new Hiihto(3); @@ -54,6 +137,36 @@ public class HiihdotTest { hiihdot.lisaa(eka); hiihdot.lisaa(toka); hiihdot.lisaa(kolmas); - assertEquals("From: Hiihdot line: 109", 3, hiihdot.getHiihdot()); + assertEquals("From: Hiihdot line: 237", 3, hiihdot.getHiihdot()); + } // Generated by ComTest END + + + // Generated by ComTest BEGIN + /** testPoista250 */ + @Test + public void testPoista250() { // Hiihdot: 250 + Hiihdot ht = new Hiihdot(); + Hiihto h1 = new Hiihto(0); Hiihto h2 = new Hiihto(0); + ht.lisaa(h1); ht.lisaa(h2); + assertEquals("From: Hiihdot line: 254", 2, ht.getHiihdot()); + assertEquals("From: Hiihdot line: 255", true, ht.poista(h1)); + assertEquals("From: Hiihdot line: 256", 1, ht.getHiihdot()); + } // Generated by ComTest END + + + // Generated by ComTest BEGIN + /** testLaskeKm271 */ + @Test + public void testLaskeKm271() { // Hiihdot: 271 + Jasen j = new Jasen(); + Hiihdot ht = new Hiihdot(); + Hiihto h1 = new Hiihto(1); + h1.aseta(2, "10"); + ht.lisaa(h1); + assertEquals("From: Hiihdot line: 277", "10.0", ht.laskeKm(j)); + Hiihto h2 = new Hiihto(1); + h2.aseta(2, "10"); + ht.lisaa(h2); + assertEquals("From: Hiihdot line: 281", "20.0", ht.laskeKm(j)); } // Generated by ComTest END } \ No newline at end of file diff --git a/src/Tietorakenteet/test/HiihtoTest.java b/src/Tietorakenteet/test/HiihtoTest.java index 57426c3bd93b2d997a8952efbc56ce1cfb560fd1..bbee663770c00ee22757972d32390496047c745a 100644 --- a/src/Tietorakenteet/test/HiihtoTest.java +++ b/src/Tietorakenteet/test/HiihtoTest.java @@ -8,7 +8,7 @@ import Tietorakenteet.*; /** * Test class made by ComTest - * @version 2020.03.12 10:27:50 // Generated by ComTest + * @version 2020.04.29 23:28:14 // Generated by ComTest * */ @SuppressWarnings({ "all" }) @@ -17,10 +17,97 @@ public class HiihtoTest { // Generated by ComTest BEGIN - /** testGetTiedot57 */ + /** testGetKysymys74 */ @Test - public void testGetTiedot57() { // Hiihto: 57 + public void testGetKysymys74() { // Hiihto: 74 + Hiihto h = new Hiihto(0); + assertEquals("From: Hiihto line: 76", "Päivämäärä", h.getKysymys(1)); + assertEquals("From: Hiihto line: 77", "Matka", h.getKysymys(2)); + assertEquals("From: Hiihto line: 78", "Kalorit", h.getKysymys(7)); + assertEquals("From: Hiihto line: 79", "Virheellinen kenttä", h.getKysymys(8)); + } // Generated by ComTest END + + + // Generated by ComTest BEGIN + /** testAnna99 */ + @Test + public void testAnna99() { // Hiihto: 99 + Hiihto h = new Hiihto(0); + h.parse("0|1|1.1.2020|10|1:30|-5|180|200|800"); + assertEquals("From: Hiihto line: 102", "1.1.2020", h.anna(1)); + assertEquals("From: Hiihto line: 103", "800", h.anna(7)); + assertEquals("From: Hiihto line: 104", "Tietoa ei löydy!", h.anna(8)); + } // Generated by ComTest END + + + // Generated by ComTest BEGIN + /** testAseta128 */ + @Test + public void testAseta128() { // Hiihto: 128 + Hiihto h = new Hiihto(0); + assertEquals("From: Hiihto line: 130", null, h.aseta(1,"1.5.2020")); + assertEquals("From: Hiihto line: 131", "Tarkista kuukausi", h.aseta(1,"1.13.2020")); + assertEquals("From: Hiihto line: 132", "Tarkista vuosi", h.aseta(1,"1.5.2022")); + assertEquals("From: Hiihto line: 133", null, h.aseta(2,"10")); + assertEquals("From: Hiihto line: 134", "Tarkista matka", h.aseta(2,"abc")); + assertEquals("From: Hiihto line: 135", "Tarkista aika", h.aseta(3,"aika")); + assertEquals("From: Hiihto line: 136", "Syötä aika muodossa hh:mm", h.aseta(3,"00")); + assertEquals("From: Hiihto line: 137", "Tarkista keskisyke", h.aseta(5,"syke")); + assertEquals("From: Hiihto line: 138", null, h.aseta(5,"100")); + assertEquals("From: Hiihto line: 139", "Tarkista maksimisyke", h.aseta(6,"syke")); + assertEquals("From: Hiihto line: 140", null, h.aseta(6,"100")); + assertEquals("From: Hiihto line: 141", "Tarkista kalorit", h.aseta(7,"kal")); + assertEquals("From: Hiihto line: 142", null, h.aseta(7,"100")); + } // Generated by ComTest END + + + // Generated by ComTest BEGIN + /** + * testClone235 + * @throws CloneNotSupportedException when error + */ + @Test + public void testClone235() throws CloneNotSupportedException { // Hiihto: 235 + Hiihto h = new Hiihto(0); + h.parse(" 1.5.2020 | 10.0 | 1:30"); + Hiihto kopio = h.clone(); + assertEquals("From: Hiihto line: 240", h.toString(), kopio.toString()); + h.parse(" 1.5.2020 | 20.0 | 1:00"); + assertEquals("From: Hiihto line: 242", false, kopio.toString().equals(h.toString())); + } // Generated by ComTest END + + + // Generated by ComTest BEGIN + /** testParse258 */ + @Test + public void testParse258() { // Hiihto: 258 + Hiihto h = new Hiihto(0); + h.parse("1 | 5 | 10.3.2020 | 20 | 1:30 | 150 "); + assertEquals("From: Hiihto line: 261", 5, h.getJasenID()); + h.toString().startsWith("1|5|10.3.2020|20|"); + h.parse("1| 20"); + assertEquals("From: Hiihto line: 264", 20, h.getJasenID()); + h.toString().startsWith("1|20|"); + } // Generated by ComTest END + + + // Generated by ComTest BEGIN + /** testToString287 */ + @Test + public void testToString287() { // Hiihto: 287 + Hiihto h = new Hiihto(0); + h.parse(" 1 | 3 | 31.3.2020 | 10 | 1:30| -5|180|200|800 "); + assertEquals("From: Hiihto line: 290", "1|3|31.3.2020|10|1:30|-5|180|200|800", h.toString()); + } // Generated by ComTest END + + + // Generated by ComTest BEGIN + /** testGetTiedot312 */ + @Test + public void testGetTiedot312() { // Hiihto: 312 Hiihto eka = new Hiihto(1); - assertEquals("From: Hiihto line: 60", "[5.3.2020, 20, 1:30, -5, 120, 180, 100]", Arrays.toString(eka.getTiedot())); + eka.parse("1|1|1.1.2020|10|1:30|-5|180|200|800"); + assertEquals("From: Hiihto line: 316", "800", eka.anna(7)); + assertEquals("From: Hiihto line: 317", "[1.1.2020, 10, 1:30, -5, 180, 200, 800]", Arrays.toString(eka.getTiedot())); } // Generated by ComTest END } \ No newline at end of file diff --git a/src/Tietorakenteet/test/JasenTest.java b/src/Tietorakenteet/test/JasenTest.java index 130384f1a6d6ab614401addd9ae4be159042aa56..876eb15b51b1ad8cf4d5bfbfb4c32fb5cd5c05c0 100644 --- a/src/Tietorakenteet/test/JasenTest.java +++ b/src/Tietorakenteet/test/JasenTest.java @@ -8,7 +8,7 @@ import Tietorakenteet.*; /** * Test class made by ComTest - * @version 2020.03.12 10:03:25 // Generated by ComTest + * @version 2020.04.29 23:43:29 // Generated by ComTest * */ @SuppressWarnings({ "all" }) @@ -17,10 +17,99 @@ public class JasenTest { // Generated by ComTest BEGIN - /** testGetTiedot60 */ + /** + * testClone42 + * @throws CloneNotSupportedException when error + */ @Test - public void testGetTiedot60() { // Jasen: 60 - Jasen testi = new Jasen(); - assertEquals("From: Jasen line: 63", "[Nokka Räkä, 01.08.1960, Lahti, 0401234567, nr@niilot.fi, 2000]", Arrays.toString(testi.getTiedot())); + public void testClone42() throws CloneNotSupportedException { // Jasen: 42 + Jasen jasen = new Jasen(); + jasen.parseJasen(" 3 | Ankka Aku | 123"); + Jasen kopio = jasen.clone(); + assertEquals("From: Jasen line: 47", jasen.toString(), kopio.toString()); + jasen.parseJasen(" 4 | Ankka Tupu | 123"); + assertEquals("From: Jasen line: 49", false, kopio.toString().equals(jasen.toString())); + } // Generated by ComTest END + + + // Generated by ComTest BEGIN + /** testParseJasen64 */ + @Test + public void testParseJasen64() { // Jasen: 64 + Jasen j = new Jasen(); + j.parseJasen(" 3 | Ukko | Pekka "); + assertEquals("From: Jasen line: 67", "3|Ukko|Pekka|||||", j.toString()); + } // Generated by ComTest END + + + // Generated by ComTest BEGIN + /** testToString89 */ + @Test + public void testToString89() { // Jasen: 89 + Jasen jasen = new Jasen(); + jasen.parseJasen(" 3 | Ankka Aku | 31.3.2020 | Jykyla | 040123 | aku@posti.fi"); + assertEquals("From: Jasen line: 92", true, jasen.toString().startsWith("3|Ankka Aku|31.3.2020|Jykyla|")); // on enemmän kuin 3 kenttää, siksi loppu | + } // Generated by ComTest END + + + // Generated by ComTest BEGIN + /** testAnna106 */ + @Test + public void testAnna106() { // Jasen: 106 + Jasen j = new Jasen(); + j.parseJasen("1|Ukko|Pekka"); + assertEquals("From: Jasen line: 109", "Ukko", j.anna(1)); + assertEquals("From: Jasen line: 110", "Pekka", j.anna(2)); + } // Generated by ComTest END + + + // Generated by ComTest BEGIN + /** testAseta134 */ + @Test + public void testAseta134() { // Jasen: 134 + Jasen jasen = new Jasen(); + assertEquals("From: Jasen line: 136", null, jasen.aseta(1,"harri")); + assertEquals("From: Jasen line: 137", null, jasen.aseta(2,"olli")); + assertEquals("From: Jasen line: 138", null, jasen.aseta(3,"01.10.1900")); + assertEquals("From: Jasen line: 139", "Tarkista kuukausi", jasen.aseta(3,"01.22.1900")); + assertEquals("From: Jasen line: 140", "Tarkista vuosi", jasen.aseta(3,"01.10.800")); + assertEquals("From: Jasen line: 141", null, jasen.aseta(4,"akaa")); + assertEquals("From: Jasen line: 142", "Paikkakunta ei saa sisältää numeroita", jasen.aseta(4,"01")); + assertEquals("From: Jasen line: 143", "Tarkista puhelinnumero", jasen.aseta(5,"12345678900")); + assertEquals("From: Jasen line: 144", null, jasen.aseta(5,"1234567890")); + assertEquals("From: Jasen line: 145", "@-merkki puuttuu!", jasen.aseta(6,"kissa")); + assertEquals("From: Jasen line: 146", null, jasen.aseta(7,"2000")); + assertEquals("From: Jasen line: 147", "Tarkista liittymisvuosi", jasen.aseta(7,"00")); + } // Generated by ComTest END + + + // Generated by ComTest BEGIN + /** testGetKysymys239 */ + @Test + public void testGetKysymys239() { // Jasen: 239 + Jasen eka = new Jasen(); + assertEquals("From: Jasen line: 241", "Virheellinen kenttä", eka.getKysymys(0)); + assertEquals("From: Jasen line: 242", "Sukunimi", eka.getKysymys(2)); + assertEquals("From: Jasen line: 243", "Virheellinen kenttä", eka.getKysymys(8)); + } // Generated by ComTest END + + + // Generated by ComTest BEGIN + /** testGetID282 */ + @Test + public void testGetID282() { // Jasen: 282 + Jasen j = new Jasen(); + j.parseJasen("1|Ukko"); + assertEquals("From: Jasen line: 285", 1, j.getID()); + } // Generated by ComTest END + + + // Generated by ComTest BEGIN + /** testGetNimi296 */ + @Test + public void testGetNimi296() { // Jasen: 296 + Jasen j = new Jasen(); + j.parseJasen("1|Ukko|Pekka"); + assertEquals("From: Jasen line: 299", "Ukko Pekka", j.getNimi()); } // Generated by ComTest END } \ No newline at end of file diff --git a/src/Tietorakenteet/test/JasenetTest.java b/src/Tietorakenteet/test/JasenetTest.java index 91cdae61dc3866287077e5f209e7f5263f9d24b9..dbd6aa27f32701abd3a1f1482e821df9df56afa5 100644 --- a/src/Tietorakenteet/test/JasenetTest.java +++ b/src/Tietorakenteet/test/JasenetTest.java @@ -1,13 +1,15 @@ package Tietorakenteet.test; // Generated by ComTest BEGIN +import Tietorakenteet.*; +import java.util.*; +import java.io.File; import static org.junit.Assert.*; import org.junit.*; -import Tietorakenteet.*; // Generated by ComTest END /** * Test class made by ComTest - * @version 2020.03.12 10:23:27 // Generated by ComTest + * @version 2020.04.25 18:43:16 // Generated by ComTest * */ @SuppressWarnings({ "all" }) @@ -16,56 +18,158 @@ public class JasenetTest { // Generated by ComTest BEGIN - /** testLisaa28 */ + /** testLisaa40 */ @Test - public void testLisaa28() { // Jasenet: 28 + public void testLisaa40() { // Jasenet: 40 Jasenet jasenet = new Jasenet(); Jasen aku1 = new Jasen(), aku2 = new Jasen(); - assertEquals("From: Jasenet line: 31", 0, jasenet.getLkm()); - jasenet.lisaa(aku1); assertEquals("From: Jasenet line: 32", 1, jasenet.getLkm()); - jasenet.lisaa(aku2); assertEquals("From: Jasenet line: 33", 2, jasenet.getLkm()); - jasenet.lisaa(aku1); assertEquals("From: Jasenet line: 34", 3, jasenet.getLkm()); - assertEquals("From: Jasenet line: 35", aku1, jasenet.anna(0)); - assertEquals("From: Jasenet line: 36", aku2, jasenet.anna(1)); - assertEquals("From: Jasenet line: 37", aku1, jasenet.anna(2)); - assertEquals("From: Jasenet line: 38", false, jasenet.anna(1) == aku1); - assertEquals("From: Jasenet line: 39", true, jasenet.anna(1) == aku2); + assertEquals("From: Jasenet line: 43", 0, jasenet.getLkm()); + jasenet.lisaa(aku1); assertEquals("From: Jasenet line: 44", 1, jasenet.getLkm()); + jasenet.lisaa(aku2); assertEquals("From: Jasenet line: 45", 2, jasenet.getLkm()); + jasenet.lisaa(aku1); assertEquals("From: Jasenet line: 46", 3, jasenet.getLkm()); + assertEquals("From: Jasenet line: 47", aku1, jasenet.anna(0)); + assertEquals("From: Jasenet line: 48", aku2, jasenet.anna(1)); + assertEquals("From: Jasenet line: 49", aku1, jasenet.anna(2)); + assertEquals("From: Jasenet line: 50", false, jasenet.anna(1) == aku1); + assertEquals("From: Jasenet line: 51", true, jasenet.anna(1) == aku2); try { - assertEquals("From: Jasenet line: 40", aku1, jasenet.anna(3)); - fail("Jasenet: 40 Did not throw IndexOutOfBoundsException"); + assertEquals("From: Jasenet line: 52", aku1, jasenet.anna(3)); + fail("Jasenet: 52 Did not throw IndexOutOfBoundsException"); } catch(IndexOutOfBoundsException _e_){ _e_.getMessage(); } - jasenet.lisaa(aku1); assertEquals("From: Jasenet line: 41", 4, jasenet.getLkm()); - jasenet.lisaa(aku1); assertEquals("From: Jasenet line: 42", 5, jasenet.getLkm()); + jasenet.lisaa(aku1); assertEquals("From: Jasenet line: 53", 4, jasenet.getLkm()); + jasenet.lisaa(aku1); assertEquals("From: Jasenet line: 54", 5, jasenet.getLkm()); } // Generated by ComTest END // Generated by ComTest BEGIN - /** testAnna65 */ + /** + * testKorvaaTaiLisaa76 + * @throws SailoException when error + * @throws CloneNotSupportedException when error + */ @Test - public void testAnna65() { // Jasenet: 65 + public void testKorvaaTaiLisaa76() throws SailoException,CloneNotSupportedException { // Jasenet: 76 + Jasenet jasenet = new Jasenet(); + Jasen eka = new Jasen(), toka = new Jasen(); + assertEquals("From: Jasenet line: 81", 0, jasenet.getLkm()); + jasenet.korvaaTaiLisaa(eka); assertEquals("From: Jasenet line: 82", 1, jasenet.getLkm()); + jasenet.korvaaTaiLisaa(toka); assertEquals("From: Jasenet line: 83", 2, jasenet.getLkm()); + Jasen kol = toka.clone(); + jasenet.korvaaTaiLisaa(kol); assertEquals("From: Jasenet line: 85", 2, jasenet.getLkm()); + } // Generated by ComTest END + + + // Generated by ComTest BEGIN + /** testAnna107 */ + @Test + public void testAnna107() { // Jasenet: 107 Jasen testi = new Jasen(); Jasen toinen = new Jasen(); Jasenet jasenet = new Jasenet(); jasenet.lisaa(testi); jasenet.lisaa(toinen); - assertEquals("From: Jasenet line: 71", testi, jasenet.anna(0)); - assertEquals("From: Jasenet line: 72", toinen, jasenet.anna(1)); + assertEquals("From: Jasenet line: 113", testi, jasenet.anna(0)); + assertEquals("From: Jasenet line: 114", toinen, jasenet.anna(1)); try { - assertEquals("From: Jasenet line: 73", toinen, jasenet.anna(8)); - fail("Jasenet: 73 Did not throw IndexOutOfBoundsException"); + assertEquals("From: Jasenet line: 115", toinen, jasenet.anna(8)); + fail("Jasenet: 115 Did not throw IndexOutOfBoundsException"); } catch(IndexOutOfBoundsException _e_){ _e_.getMessage(); } } // Generated by ComTest END // Generated by ComTest BEGIN - /** testGetLkm108 */ + /** + * testEtsi132 + * @throws SailoException when error + */ + @Test + public void testEtsi132() throws SailoException { // Jasenet: 132 + Jasenet jasenet = new Jasenet(); + Jasen eka = new Jasen(); eka.parseJasen("1|Ukko|Pekka|Akaa|"); + Jasen toka = new Jasen(); toka.parseJasen("2|Akka|Pekka|Helsinki|"); + Jasen kol = new Jasen(); kol.parseJasen("3|Jussi|Mietaa|Kurikka|"); + jasenet.lisaa(eka); jasenet.lisaa(toka); jasenet.lisaa(kol); + List<Jasen> loytyneet; + loytyneet = (List<Jasen>)jasenet.etsi("*k*",1); + assertEquals("From: Jasenet line: 142", 2, loytyneet.size()); + loytyneet = (List<Jasen>)jasenet.etsi("*P*",2); + assertEquals("From: Jasenet line: 144", 2, loytyneet.size()); + assertEquals("From: Jasenet line: 145", true, loytyneet.get(0) == eka); + assertEquals("From: Jasenet line: 146", true, loytyneet.get(1) == toka); + loytyneet = (List<Jasen>)jasenet.etsi(null,-1); + assertEquals("From: Jasenet line: 148", 3, loytyneet.size()); + } // Generated by ComTest END + + + // Generated by ComTest BEGIN + /** + * testLueTiedostosta171 + * @throws SailoException when error + */ + @Test + public void testLueTiedostosta171() throws SailoException { // Jasenet: 171 + Jasenet jasenet = new Jasenet(); + Jasen aku1 = new Jasen(), aku2 = new Jasen(); + File ftied = new File("nimet.dat"); + ftied.delete(); + try { + jasenet.lueTiedostosta(); + fail("Jasenet: 178 Did not throw SailoException"); + } catch(SailoException _e_){ _e_.getMessage(); } + jasenet.lisaa(aku1); + jasenet.lisaa(aku2); + jasenet.tallenna(); + jasenet = new Jasenet(); // Poistetaan vanhat luomalla uusi + jasenet.lueTiedostosta(); // johon ladataan tiedot tiedostosta. + jasenet.lisaa(aku2); + jasenet.tallenna(); + assertEquals("From: Jasenet line: 186", true, ftied.delete()); + File fbak = new File("nimet.bak"); + assertEquals("From: Jasenet line: 188", true, fbak.delete()); + } // Generated by ComTest END + + + // Generated by ComTest BEGIN + /** testGetLkm259 */ @Test - public void testGetLkm108() { // Jasenet: 108 + public void testGetLkm259() { // Jasenet: 259 Jasen eka = new Jasen(); Jasen toka = new Jasen(); Jasenet jasenet = new Jasenet(); jasenet.lisaa(eka); jasenet.lisaa(toka); - assertEquals("From: Jasenet line: 114", 2, jasenet.getLkm()); + assertEquals("From: Jasenet line: 265", 2, jasenet.getLkm()); + } // Generated by ComTest END + + + // Generated by ComTest BEGIN + /** + * testPoista304 + * @throws SailoException when error + */ + @Test + public void testPoista304() throws SailoException { // Jasenet: 304 + Jasenet jasenet = new Jasenet(); + Jasen eka = new Jasen(), toka = new Jasen(); + int id1 = eka.getID(); + jasenet.lisaa(eka); jasenet.lisaa(toka); + assertEquals("From: Jasenet line: 310", 1, jasenet.poista(id1+1)); + assertEquals("From: Jasenet line: 311", 1, jasenet.getLkm()); + assertEquals("From: Jasenet line: 312", 1, jasenet.poista(id1)); assertEquals("From: Jasenet line: 312", 0, jasenet.getLkm()); + } // Generated by ComTest END + + + // Generated by ComTest BEGIN + /** + * testEtsiID331 + * @throws SailoException when error + */ + @Test + public void testEtsiID331() throws SailoException { // Jasenet: 331 + Jasenet jasenet = new Jasenet(); + Jasen eka = new Jasen(), toka = new Jasen(); + int id1 = eka.getID(); + jasenet.lisaa(eka); jasenet.lisaa(toka); + assertEquals("From: Jasenet line: 337", 1, jasenet.etsiID(id1+1)); } // Generated by ComTest END } \ No newline at end of file diff --git a/src/Tietorakenteet/test/RekisteriTest.java b/src/Tietorakenteet/test/RekisteriTest.java index 51d36013c1c4e9bcd0130a378f04ef1c429627f1..2e71afa992f44616d5e996cc3807107f600a3a1b 100644 --- a/src/Tietorakenteet/test/RekisteriTest.java +++ b/src/Tietorakenteet/test/RekisteriTest.java @@ -1,13 +1,15 @@ package Tietorakenteet.test; // Generated by ComTest BEGIN +import Tietorakenteet.*; +import java.io.*; +import java.util.*; import static org.junit.Assert.*; import org.junit.*; -import Tietorakenteet.*; // Generated by ComTest END /** * Test class made by ComTest - * @version 2020.03.12 13:19:39 // Generated by ComTest + * @version 2020.04.27 13:19:08 // Generated by ComTest * */ @SuppressWarnings({ "all" }) @@ -16,79 +18,154 @@ public class RekisteriTest { // Generated by ComTest BEGIN - /** testLisaa26 */ + /** testLisaa28 */ @Test - public void testLisaa26() { // Rekisteri: 26 + public void testLisaa28() { // Rekisteri: 28 Rekisteri rekisteri = new Rekisteri(); Jasen eka = new Jasen(); Jasen toka = new Jasen(); - Jasenet jasenet = new Jasenet(); rekisteri.lisaa(eka); rekisteri.lisaa(toka); - assertEquals("From: Rekisteri line: 33", 2, jasenet.getLkm()); + assertEquals("From: Rekisteri line: 34", 2, rekisteri.getLkm()); + } // Generated by ComTest END + + + // Generated by ComTest BEGIN + /** + * testKorvaaTaiLisaa48 + * @throws SailoException when error + * @throws CloneNotSupportedException when error + */ + @Test + public void testKorvaaTaiLisaa48() throws SailoException,CloneNotSupportedException { // Rekisteri: 48 + Rekisteri R = new Rekisteri(); + Jasen eka = new Jasen(), toka = new Jasen(); + assertEquals("From: Rekisteri line: 53", 0, R.getLkm()); + R.korvaaTaiLisaa(eka); assertEquals("From: Rekisteri line: 54", 1, R.getLkm()); + R.korvaaTaiLisaa(toka); assertEquals("From: Rekisteri line: 55", 2, R.getLkm()); + Jasen kol = toka.clone(); + R.korvaaTaiLisaa(kol); assertEquals("From: Rekisteri line: 57", 2, R.getLkm()); } // Generated by ComTest END // Generated by ComTest BEGIN - /** testAnnaJasen45 */ + /** testAnnaJasen81 */ @Test - public void testAnnaJasen45() { // Rekisteri: 45 + public void testAnnaJasen81() { // Rekisteri: 81 Rekisteri rekisteri = new Rekisteri(); Jasen eka = new Jasen(); Jasen toka = new Jasen(); - Jasenet jasenet = new Jasenet(); - jasenet.lisaa(eka); - jasenet.lisaa(toka); - assertEquals("From: Rekisteri line: 52", eka, rekisteri.annaJasen(0)); + rekisteri.lisaa(eka); + rekisteri.lisaa(toka); + assertEquals("From: Rekisteri line: 87", eka, rekisteri.annaJasen(0)); + } // Generated by ComTest END + + + // Generated by ComTest BEGIN + /** + * testEtsi102 + * @throws CloneNotSupportedException when error + * @throws SailoException when error + */ + @Test + public void testEtsi102() throws CloneNotSupportedException, SailoException { // Rekisteri: 102 + Rekisteri R = new Rekisteri(); + Jasen eka = new Jasen(); + eka.aseta(1,"Pekka"); + R.lisaa(eka); + Collection<Jasen> loytyneet = R.etsi("*Pe*",1); + assertEquals("From: Rekisteri line: 109", 1, loytyneet.size()); + Iterator<Jasen> it = loytyneet.iterator(); + assertEquals("From: Rekisteri line: 111", true, it.next() == eka); } // Generated by ComTest END // Generated by ComTest BEGIN - /** testLisaaHiihto64 */ + /** testLisaaHiihto123 */ @Test - public void testLisaaHiihto64() { // Rekisteri: 64 + public void testLisaaHiihto123() { // Rekisteri: 123 Rekisteri rekisteri = new Rekisteri(); Hiihto eka = new Hiihto(1); Hiihto toka = new Hiihto(1); rekisteri.lisaaHiihto(eka); rekisteri.lisaaHiihto(toka); - assertEquals("From: Rekisteri line: 70", 2, rekisteri.getHiihdot()); + assertEquals("From: Rekisteri line: 129", 2, rekisteri.getHiihdot()); } // Generated by ComTest END // Generated by ComTest BEGIN - /** testAnnaHiihto82 */ + /** testAnnaHiihto141 */ @Test - public void testAnnaHiihto82() { // Rekisteri: 82 + public void testAnnaHiihto141() { // Rekisteri: 141 Rekisteri rekisteri = new Rekisteri(); Hiihto eka = new Hiihto(1); Hiihto toka = new Hiihto(1); rekisteri.lisaaHiihto(eka); rekisteri.lisaaHiihto(toka); - assertEquals("From: Rekisteri line: 88", eka, rekisteri.annaHiihto(0)); + assertEquals("From: Rekisteri line: 147", eka, rekisteri.annaHiihto(0)); } // Generated by ComTest END // Generated by ComTest BEGIN - /** testGetJasenenHiihdot100 */ + /** testGetJasenenHiihdot159 */ @Test - public void testGetJasenenHiihdot100() { // Rekisteri: 100 - Rekisteri rekisteri = new Rekisteri(); + public void testGetJasenenHiihdot159() { // Rekisteri: 159 Hiihto eka = new Hiihto(1); Hiihto toka = new Hiihto(1); Hiihto kolmas = new Hiihto(2); + Rekisteri rekisteri = new Rekisteri(); rekisteri.lisaaHiihto(eka); rekisteri.lisaaHiihto(toka); rekisteri.lisaaHiihto(kolmas); - assertEquals("From: Rekisteri line: 108", "[eka, toka]", rekisteri.getJasenenHiihdot(1)); - assertEquals("From: Rekisteri line: 109", "[kolmas]", rekisteri.getJasenenHiihdot(2)); } // Generated by ComTest END // Generated by ComTest BEGIN - /** testGetLkm140 */ + /** + * testLueTiedostosta178 + * @throws SailoException when error + */ + @Test + public void testLueTiedostosta178() throws SailoException { // Rekisteri: 178 + Rekisteri r = new Rekisteri(); + Jasen j1 = new Jasen(); Jasen j2 = new Jasen(); + Hiihto h1 = new Hiihto(1); + Hiihto h2 = new Hiihto(1); + Hiihto h3 = new Hiihto(2); + Hiihto h4 = new Hiihto(2); + File fjas = new File("nimet.dat"); + File fhiih = new File("hiihdot.dat"); + fjas.delete(); + fhiih.delete(); + try { + r.lueTiedostosta(); + fail("Rekisteri: 192 Did not throw SailoException"); + } catch(SailoException _e_){ _e_.getMessage(); } + r.lisaa(j1); + r.lisaa(j2); + r.lisaaHiihto(h1); + r.lisaaHiihto(h2); + r.lisaaHiihto(h3); + r.lisaaHiihto(h4); + r.tallenna(); + r = new Rekisteri(); + r.lueTiedostosta(); + r.lisaa(j2); + r.lisaaHiihto(h4); + r.tallenna(); + assertEquals("From: Rekisteri line: 205", true, fjas.delete()); + assertEquals("From: Rekisteri line: 206", true, fhiih.delete()); + File fjasbak = new File("nimet.bak"); + File fhbak = new File("hiihdot.bak"); + assertEquals("From: Rekisteri line: 209", true, fjasbak.delete()); + assertEquals("From: Rekisteri line: 210", true, fhbak.delete()); + } // Generated by ComTest END + + + // Generated by ComTest BEGIN + /** testGetLkm249 */ @Test - public void testGetLkm140() { // Rekisteri: 140 + public void testGetLkm249() { // Rekisteri: 249 Rekisteri rekisteri = new Rekisteri(); Jasen eka = new Jasen(); Jasen toka = new Jasen(); @@ -98,9 +175,9 @@ public class RekisteriTest { // Generated by ComTest BEGIN - /** testGetHiihdot156 */ + /** testGetHiihdot265 */ @Test - public void testGetHiihdot156() { // Rekisteri: 156 + public void testGetHiihdot265() { // Rekisteri: 265 Rekisteri rekisteri = new Rekisteri(); Hiihto eka = new Hiihto(1); Hiihto toka = new Hiihto(1); @@ -108,6 +185,53 @@ public class RekisteriTest { rekisteri.lisaaHiihto(eka); rekisteri.lisaaHiihto(toka); rekisteri.lisaaHiihto(kolmas); - assertEquals("From: Rekisteri line: 164", 3, rekisteri.getHiihdot()); + assertEquals("From: Rekisteri line: 273", 3, rekisteri.getHiihdot()); + } // Generated by ComTest END + + + // Generated by ComTest BEGIN + /** testLaskeKm284 */ + @Test + public void testLaskeKm284() { // Rekisteri: 284 + Rekisteri R = new Rekisteri(); + Jasen j = new Jasen(); + R.lisaa(j); + Hiihto h1 = new Hiihto(1); + h1.aseta(2, "10"); + R.lisaaHiihto(h1); + assertEquals("From: Rekisteri line: 291", "10.0", R.laskeKm(j)); + Hiihto h2 = new Hiihto(1); + h2.aseta(2, "10"); + R.lisaaHiihto(h2); + assertEquals("From: Rekisteri line: 295", "20.0", R.laskeKm(j)); + } // Generated by ComTest END + + + // Generated by ComTest BEGIN + /** + * testPoistaHiihtaja307 + * @throws Exception when error + */ + @Test + public void testPoistaHiihtaja307() throws Exception { // Rekisteri: 307 + Rekisteri rekisteri = new Rekisteri(); + Jasen eka = new Jasen(); + rekisteri.lisaa(eka); + assertEquals("From: Rekisteri line: 312", 1, rekisteri.getLkm()); + assertEquals("From: Rekisteri line: 313", 1, rekisteri.poistaHiihtaja(eka)); + assertEquals("From: Rekisteri line: 314", 0, rekisteri.getLkm()); + } // Generated by ComTest END + + + // Generated by ComTest BEGIN + /** testPoistaHiihto329 */ + @Test + public void testPoistaHiihto329() { // Rekisteri: 329 + Rekisteri R = new Rekisteri(); + Hiihto h1 = new Hiihto(0); Hiihto h2 = new Hiihto(0); + R.lisaaHiihto(h1); R.lisaaHiihto(h2); + assertEquals("From: Rekisteri line: 333", 2, R.getHiihdot()); + assertEquals("From: Rekisteri line: 334", true, R.poistaHiihto(h1)); + assertEquals("From: Rekisteri line: 335", 1, R.getHiihdot()); } // Generated by ComTest END } \ No newline at end of file diff --git a/src/Tietorakenteet/test/TietueTest.java b/src/Tietorakenteet/test/TietueTest.java new file mode 100644 index 0000000000000000000000000000000000000000..37a852b994522134ad6c88ed0d0fbf35a6d4a88c --- /dev/null +++ b/src/Tietorakenteet/test/TietueTest.java @@ -0,0 +1,93 @@ +package Tietorakenteet.test; +// Generated by ComTest BEGIN +import static org.junit.Assert.*; +import org.junit.*; +import Tietorakenteet.*; +// Generated by ComTest END + +/** + * Test class made by ComTest + * @version 2020.04.25 18:30:52 // Generated by ComTest + * + */ +@SuppressWarnings({ "all" }) +public class TietueTest { + + + + // Generated by ComTest BEGIN + /** testInt17 */ + @Test + public void testInt17() { // Tietue: 17 + Hiihto h = new Hiihto(0); + assertEquals("From: Tietue line: 19", 7, h.getKenttia()); + } // Generated by ComTest END + + + // Generated by ComTest BEGIN + /** testInt29 */ + @Test + public void testInt29() { // Tietue: 29 + Hiihto h = new Hiihto(0); + assertEquals("From: Tietue line: 31", 1, h.ekaKentta()); + } // Generated by ComTest END + + + // Generated by ComTest BEGIN + /** testString41 */ + @Test + public void testString41() { // Tietue: 41 + Hiihto h = new Hiihto(0); + assertEquals("From: Tietue line: 43", "Päivämäärä", h.getKysymys(1)); + } // Generated by ComTest END + + + // Generated by ComTest BEGIN + /** testString53 */ + @Test + public void testString53() { // Tietue: 53 + Hiihto h = new Hiihto(0); + h.parse("1|1| 1.5.2020 | 10.0 | 1:30 | -5 | 180 | 200 | 200 "); + assertEquals("From: Tietue line: 56", "1.5.2020", h.anna(1)); + assertEquals("From: Tietue line: 57", "10.0", h.anna(2)); + assertEquals("From: Tietue line: 58", "1:30", h.anna(3)); + assertEquals("From: Tietue line: 59", "180", h.anna(5)); + } // Generated by ComTest END + + + // Generated by ComTest BEGIN + /** testString72 */ + @Test + public void testString72() { // Tietue: 72 + Hiihto h = new Hiihto(0); + assertEquals("From: Tietue line: 74", null, h.aseta(3,"1:30")); + assertEquals("From: Tietue line: 75", null, h.aseta(4,"käpy")); + } // Generated by ComTest END + + + // Generated by ComTest BEGIN + /** + * testTietue86 + * @throws CloneNotSupportedException when error + */ + @Test + public void testTietue86() throws CloneNotSupportedException { // Tietue: 86 + Hiihto h = new Hiihto(0); + h.parse(" 1.5.2020 | 10.0 | 1:30 | 180 | 200 "); + Object kopio = h.clone(); + assertEquals("From: Tietue line: 91", h.toString(), kopio.toString()); + h.parse(" 1.5.2020 | 2.0 | 0:30 | 120 | 130 "); + assertEquals("From: Tietue line: 93", false, kopio.toString().equals(h.toString())); + assertEquals("From: Tietue line: 94", true, kopio instanceof Hiihto); + } // Generated by ComTest END + + + // Generated by ComTest BEGIN + /** testString104 */ + @Test + public void testString104() { // Tietue: 104 + Hiihto h = new Hiihto(0); + h.parse("1| 0| 1.5.2020 | 10.0 | 1:30 | -5 | 100 | 120 | 200 "); + assertEquals("From: Tietue line: 107", "1|0|1.5.2020|10.0|1:30|-5|100|120|200", h.toString()); + } // Generated by ComTest END +} \ No newline at end of file diff --git a/src/fxHiihtorekisteri/HiihtorekisteriGUIController.java b/src/fxHiihtorekisteri/HiihtorekisteriGUIController.java index 3efc006c071769236a9e184d58e88101786fa290..3929aaf3dfc6b55c10781494ed5f7c5060fbb4ac 100644 --- a/src/fxHiihtorekisteri/HiihtorekisteriGUIController.java +++ b/src/fxHiihtorekisteri/HiihtorekisteriGUIController.java @@ -1,95 +1,109 @@ package fxHiihtorekisteri; -import java.io.PrintStream; +import java.net.URL; import java.util.ArrayList; - +import java.util.Collection; +import java.util.ResourceBundle; import Tietorakenteet.Hiihto; import Tietorakenteet.Jasen; import Tietorakenteet.Rekisteri; import Tietorakenteet.SailoException; +import fi.jyu.mit.fxgui.ComboBoxChooser; import fi.jyu.mit.fxgui.Dialogs; import fi.jyu.mit.fxgui.ListChooser; import fi.jyu.mit.fxgui.ModalController; import fi.jyu.mit.fxgui.StringGrid; -import fi.jyu.mit.fxgui.TextAreaOutputStream; -import javafx.event.ActionEvent; +import javafx.application.Platform; import javafx.fxml.FXML; +import javafx.fxml.Initializable; import javafx.scene.control.Button; import javafx.scene.control.MenuItem; -import javafx.scene.control.TableColumn; -import javafx.scene.control.TextArea; import javafx.scene.control.TextField; - +import javafx.scene.layout.GridPane; /** - * @author JPo ja MHo + * @author MHo * @version 13.1.2020 - * + * Hiihtorekisteri, johon voi lisätä jäseniä ja heille hiihtosuorituksia. + * Jäseniä voi myös muokata ja poistaa. + * Hiihtoja voi muokata, mutta poisto ei vielä toimi. */ -public class HiihtorekisteriGUIController { +public class HiihtorekisteriGUIController implements Initializable { - @FXML - private TextField Hakukentta; + @FXML private MenuItem ylanappiTallenna; + @FXML private MenuItem ylanappiTulosta; + @FXML private MenuItem ylanappiLisaaHiihtaja; + @FXML private MenuItem ylanappiPoistaHiihtaja; + @FXML private MenuItem ylanappiLopeta; + @FXML private MenuItem ylanappiKayttoOhje; + @FXML private MenuItem ylanappiTietoja; - @FXML - private Button nappiLisaaHiihto; - - @FXML - private Button nappiMuokkaa; - - @FXML - private Button nappiTulosta; + @FXML private ComboBoxChooser<String> cbKentat; + @FXML private TextField Hakuehto; + @FXML private ListChooser<Jasen> chooserJasenet; - @FXML - private MenuItem ylanappiTallenna; - - @FXML - private MenuItem ylanappiTulosta; - - @FXML - private MenuItem ylanappiLisaaHiihtaja; - - @FXML - private MenuItem ylanappiPoistaHiihtaja; - - @FXML - private MenuItem ylanappiLopeta; + @FXML private GridPane gridJasen; + @FXML private TextField kenttaENimi; + @FXML private TextField kenttaSNimi; + @FXML private TextField kenttaSAika; + @FXML private TextField kenttaPKunta; + @FXML private TextField kenttaPuh; + @FXML private TextField kenttaEmail; + @FXML private TextField kenttaLVuosi; + @FXML private TextField kenttaKm; - @FXML - private MenuItem ylanappiKayttoOhje; + @FXML private StringGrid<Hiihto> gridHiihdot; - @FXML - private MenuItem ylanappiTietoja; + @FXML private Button nappiLisaaHiihto; + @FXML private Button nappiTulosta; - @FXML - private ListChooser<Jasen> chooserJasenet; + private Rekisteri rekisteri; + private Jasen jasenKohdalla; + private static Jasen apujasen = new Jasen(); - @FXML - private TextField kenttaNimi; - - @FXML - private TextField kenttaSAika; - - @FXML - private TextField kenttaPKunta; - - @FXML - private TextField kenttaPuh; - - @FXML - private TextField kenttaEmail; + @Override + public void initialize(URL url, ResourceBundle bundle) { + alusta(); + } + + @FXML void handleHakuehto() { + hae(0); + } + + @FXML void handleLisaaHiihtaja() { + lisaaHiihtaja(); + } + + @FXML void handleLisaaHiihto() { + lisaaHiihto(); + } + + @FXML void handleMuokkaa() { + muokkaa(); + } + + @FXML void handleTulosta() { + tulosta(jasenKohdalla); + } - @FXML - private TextField kenttaLVuosi; + @FXML void handlePoistaHiihtaja() { + poistaHiihtaja(); + } - @FXML - private TextField kenttaKm; + @FXML private String handleTallenna() { + return tallenna(); + } - @FXML - private StringGrid<?> gridHiihdot; - - private Rekisteri rekisteri; - private Jasen jasenKohdalla; + @FXML void handleLopeta() { + handleTallenna(); + Platform.exit(); + } + + @FXML void handleKayttoOhje() { ModalController.showModal(HiihtorekisteriGUIController.class.getResource("Ohje.fxml"), "Käyttöohje", null, ""); + } + + @FXML void handleTietoja() { ModalController.showModal(HiihtorekisteriGUIController.class.getResource("Tietoja.fxml"), "Tietoja", null, ""); + } /** @@ -98,120 +112,217 @@ public class HiihtorekisteriGUIController { public void setRekisteri(Rekisteri rekisteri) { this.rekisteri = rekisteri; alusta(); - naytaJasen(); + lueTiedosto(); } - + /** - * Näyttää listasta valitun jäsenen tiedot, tilapäisesti yhteen isoon edit-kenttään + * Alustaa listan jäsenistä */ - protected void naytaJasen() { - jasenKohdalla = chooserJasenet.getSelectedObject(); - - if (jasenKohdalla == null) return; + protected void alusta() { + chooserJasenet.clear(); + chooserJasenet.addSelectionListener(e -> naytaJasen()); - TextField[] kentat = new TextField[] {kenttaNimi, kenttaSAika, kenttaPKunta, kenttaPuh, kenttaEmail, kenttaLVuosi}; - String[] tiedot = jasenKohdalla.getTiedot(); - for (int i = 0; i < tiedot.length; i++) { - kentat[i].setText(tiedot[i]); - } + cbKentat.clear(); + cbKentat.add(apujasen.getKysymys(2), null); + cbKentat.add(apujasen.getKysymys(4), null); + cbKentat.getSelectionModel().select(0); + + TextField[] kentat = new TextField[]{kenttaENimi, kenttaSNimi, kenttaSAika, kenttaPKunta, kenttaPuh, kenttaEmail, kenttaLVuosi}; + //TietueGUIController.luoKentat(gridJasen, jasenKohdalla); + for (TextField edit: kentat) + if ( edit != null ) { + edit.setEditable(false); + //edit.setOnMouseClicked(e -> { if ( e.getClickCount() > 1 ) muokkaa(getFieldId(e.getSource(),0)); }); + //edit.focusedProperty().addListener((a,o,n) -> kentta = getFieldId(edit,kentta)); + } } /** - * Näyttää listasta valitun jäsenen hiihdot + * Alustaa kerhon lukemalla sen valitun nimisestä tiedostosta + * @return null jos onnistuu, muuten virhe tekstinä */ - protected void naytaHiihdot() { - gridHiihdot.clear(); - jasenKohdalla = chooserJasenet.getSelectedObject(); - ArrayList<Hiihto> jasenenHiihdot = rekisteri.getJasenenHiihdot(jasenKohdalla.getID()); - for (int i = 0; i < jasenenHiihdot.size(); i++) { - String[] rivi = jasenenHiihdot.get(i).getTiedot(); - gridHiihdot.add(rivi); + protected String lueTiedosto() { + try { + rekisteri.lueTiedostosta(); + hae(0); + return null; + } catch (SailoException e) { + hae(0); + String virhe = e.getMessage(); + if ( virhe != null ) Dialogs.showMessageDialog(virhe); + return virhe; + } + } + + + /** + * Hakee jäsenten tiedot listaan + * @param jnr jäsenen numero, joka aktivoidaan haun jälkeen + */ + protected void hae(int jnr) { + int jnro = jnr; // jnro jäsenen numero, joka aktivoidaan haun jälkeen + if ( jnro <= 0 ) { + Jasen kohdalla = jasenKohdalla; + if ( kohdalla != null ) jnro = kohdalla.getID(); } + + int k; + k = 0; + if (cbKentat.getSelectionModel().getSelectedIndex() == 0) k = 2; + if (cbKentat.getSelectionModel().getSelectedIndex() == 1) k = 4; + //int k = cbKentat.getSelectionModel().getSelectedIndex() + 2; //apujasen.ekaKentta(); + String ehto = Hakuehto.getText(); + if (ehto.indexOf('*') < 0) ehto = "*" + ehto + "*"; + + chooserJasenet.clear(); + + int index = 0; + Collection<Jasen> jasenet; + if (ehto == "**") naytaKaikki(); + else { + try { + jasenet = rekisteri.etsi(ehto, k); + int i = 0; + for (Jasen jasen:jasenet) { + if (jasen.getID() == jnro) index = i; + chooserJasenet.add(jasen.getNimi(), jasen); + i++; + } + } catch (SailoException ex) { + Dialogs.showMessageDialog("Jäsenen hakemisessa ongelmia! " + ex.getMessage()); + } + chooserJasenet.setSelectedIndex(index); // tästä tulee muutosviesti joka näyttää jäsenen + } } - @FXML - void handleHaku() { - // + /* + * Näytetään kaikki rekisterin hiihtäjät + */ + private void naytaKaikki() { + for (int i = 1; i < rekisteri.getLkm(); i++) { + chooserJasenet.add(rekisteri.annaJasen(i).getNimi(), rekisteri.annaJasen(i)); + } } + - @FXML - void handleLisaaHiihto() { - //ModalController.showModal(HiihtorekisteriGUIController.class.getResource("LisaaHiihto.fxml"), "Hiihto", null, ""); - int id = chooserJasenet.getSelectedObject().getID(); - rekisteri.lisaaHiihto(new Hiihto(id)); - hae(jasenKohdalla.getID()); + /** + * Näyttää listasta valitun jäsenen tiedot + */ + protected void naytaJasen() { + jasenKohdalla = chooserJasenet.getSelectedObject(); + if (jasenKohdalla == null) return; + TextField[] kentat = new TextField[] {kenttaENimi, kenttaSNimi, kenttaSAika, kenttaPKunta, kenttaPuh, kenttaEmail, kenttaLVuosi, kenttaKm}; + TietueGUIController.naytaTietue(kentat, jasenKohdalla); + laskeKm(); + naytaHiihdot(jasenKohdalla); } - @FXML - void handleMuokkaa() { - ModalController.showModal(HiihtorekisteriGUIController.class.getResource("Muokkaa.fxml"), "Hiihtaja", null, ""); + + /** + * Näyetään valitun jäsenen yhteiskilometrit + */ + private void laskeKm() { + kenttaKm.setText(rekisteri.laskeKm(jasenKohdalla)); } - @FXML - void handleTulosta() { - ModalController.showModal(HiihtorekisteriGUIController.class.getResource("Tulosta.fxml"), "Tulosta", null, ""); + + /** + * Muokkaa olemassaolevaa jäsentä + */ + public void muokkaa() { + if ( jasenKohdalla == null ) return; + try { + Jasen jasen; + jasen = TietueGUIController.kysyTietue(null, jasenKohdalla.clone(), rekisteri); + if ( jasen == null ) return; + rekisteri.korvaaTaiLisaa(jasen); + hae(jasen.getID()); + } catch (CloneNotSupportedException e) { + // + } catch (SailoException e) { + Dialogs.showMessageDialog(e.getMessage()); + } + laskeKm(); } - @FXML - void handleLisaaHiihtaja() { + + /** + * Luodaan rekisteriin uusi jäsen + */ + private void lisaaHiihtaja() { Jasen uusi = new Jasen(); + uusi = TietueGUIController.kysyTietue(null, uusi); + if ( uusi == null ) return; rekisteri.lisaa(uusi); - //ModalController.showModal(HiihtorekisteriGUIController.class.getResource("LisaaHiihtaja.fxml"), "Hiihtaja", null, ""); hae(uusi.getID()); } - - @FXML - void handlePoistaHiihtaja() { - Dialogs.showMessageDialog("Poisto ei vielä toimi"); - } - @FXML - void handleTallenna() { - Dialogs.showMessageDialog("Tallennus ei toimi vielä"); - } - @FXML - void handleLopeta() { - Dialogs.showMessageDialog("Tallentaa tiedot ja lopettaa ohjelman. Tallennus ei toimi vielä."); + private void lisaaHiihto() { + if ( jasenKohdalla == null ) return; + Hiihto uusi = new Hiihto(jasenKohdalla.getID()); + uusi = TietueGUIController.kysyTietue(null, uusi); + if ( uusi == null ) return; + rekisteri.lisaaHiihto(uusi); + naytaHiihdot(jasenKohdalla); + gridHiihdot.selectRow(1000); // järjestetään viimeinen rivi valituksi } + - @FXML - void handleKayttoOhje() { - ModalController.showModal(HiihtorekisteriGUIController.class.getResource("Ohje.fxml"), "Ohje", null, ""); + /** + * Näyttää listasta valitun jäsenen hiihdot + */ + private void naytaHiihdot(Jasen j) { + if (j == null) return; + gridHiihdot.clear(); + ArrayList<Hiihto> jasenenHiihdot = rekisteri.getJasenenHiihdot(j.getID()); + //String[] rivi = null; + for (Hiihto h : jasenenHiihdot) { + //rivi = h.getTiedot(); + gridHiihdot.add(h, h.getTiedot()); + } + gridHiihdot.setEditable(false); } + - @FXML - void handleTietoja() { - ModalController.showModal(HiihtorekisteriGUIController.class.getResource("Tietoja.fxml"), "Tietoja", null, ""); + /* + * Poistetaan listalta valittu jäsen + */ + private void poistaHiihtaja() { + Jasen jasen = jasenKohdalla; + if ( jasen == null ) return; + if ( !Dialogs.showQuestionDialog("Poisto", "Poistetaanko hiihtaja: " + jasen.getNimi(), "Kyllä", "Ei") ) + return; + rekisteri.poistaHiihtaja(jasen); + int index = chooserJasenet.getSelectedIndex(); + hae(0); + chooserJasenet.setSelectedIndex(index); } - /** - * Hakee jäsenten tiedot listaan - * @param jnro jäsenen numero, joka aktivoidaan haun jälkeen - */ - protected void hae(int jnro) { - chooserJasenet.clear(); - - int index = 0; - for (int i = 0; i < rekisteri.getLkm(); i++) { - Jasen jasen = rekisteri.annaJasen(i); - if (jasen.getID() == jnro) index = i; - chooserJasenet.add(jasen.getID() + " " + jasen.getNimi(), jasen); + private void tulosta(Jasen j) { + if (j == null) { + Dialogs.showMessageDialog("Valitse jäsen, jonka tiedot tulostetaan"); + return; } - chooserJasenet.setSelectedIndex(index); // tästä tulee muutosviesti joka näyttää jäsenen + TulostaGUIController.tulosta(j, rekisteri); } - + /** - * Alustaa listan jäsenistä + * @return ilmoitus, onnistuuko tallentaminen vai ei */ - protected void alusta() { - chooserJasenet.clear(); - chooserJasenet.addSelectionListener(e -> naytaJasen()); - chooserJasenet.addSelectionListener(e -> naytaHiihdot()); + public String tallenna() { + try { + rekisteri.tallenna(); + Dialogs.showMessageDialog("Tiedot tallennettu"); + return null; + } catch (SailoException ex) { + Dialogs.showMessageDialog("Tallennuksessa ongelmia! " + ex.getMessage()); + return ex.getMessage(); + } } } \ No newline at end of file diff --git a/src/fxHiihtorekisteri/HiihtorekisteriMain.java b/src/fxHiihtorekisteri/HiihtorekisteriMain.java index fdcab47110859fbed28a91a6aca47114d5a18e22..7c77028e80bd85bc9896757290f68cfa7e7ecd99 100644 --- a/src/fxHiihtorekisteri/HiihtorekisteriMain.java +++ b/src/fxHiihtorekisteri/HiihtorekisteriMain.java @@ -1,16 +1,14 @@ -package fxHiihtorekisteri; +package fxHiihtorekisteri; import Tietorakenteet.Rekisteri; import javafx.application.Application; import javafx.stage.Stage; import javafx.scene.Scene; -import javafx.scene.layout.BorderPane; import javafx.scene.layout.Pane; import javafx.fxml.FXMLLoader; /** * @author JPo ja MHo * @version 13.1.2020 - * */ public class HiihtorekisteriMain extends Application { @Override diff --git a/src/fxHiihtorekisteri/LisaaHiihtaja.fxml b/src/fxHiihtorekisteri/LisaaHiihtaja.fxml deleted file mode 100644 index 38693de4c6b1c004b5524642fb4774e97e1272d0..0000000000000000000000000000000000000000 --- a/src/fxHiihtorekisteri/LisaaHiihtaja.fxml +++ /dev/null @@ -1,62 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> - -<?import javafx.geometry.Insets?> -<?import javafx.scene.control.Button?> -<?import javafx.scene.control.DatePicker?> -<?import javafx.scene.control.Label?> -<?import javafx.scene.control.TextField?> -<?import javafx.scene.layout.BorderPane?> -<?import javafx.scene.layout.ColumnConstraints?> -<?import javafx.scene.layout.GridPane?> -<?import javafx.scene.layout.HBox?> -<?import javafx.scene.layout.RowConstraints?> - -<BorderPane xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="fxHiihtorekisteri.LisaaHiihtajaGUIController"> - <bottom> - <HBox spacing="10.0" BorderPane.alignment="CENTER"> - <BorderPane.margin> - <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" /> - </BorderPane.margin> - <children> - <Button fx:id="nappiTallenna" onAction="#handleTallenna" text="Tallenna" /> - <Button fx:id="nappiPeruuta" alignment="CENTER" mnemonicParsing="false" onAction="#handlePeruuta" text="Peruuta" /> - </children> - </HBox> - </bottom> - <center> - <GridPane hgap="10.0" BorderPane.alignment="CENTER"> - <columnConstraints> - <ColumnConstraints fillWidth="false" halignment="RIGHT" hgrow="SOMETIMES" /> - <ColumnConstraints hgrow="ALWAYS" maxWidth="550.000010172526" minWidth="69.33333841959634" /> - </columnConstraints> - <rowConstraints> - <RowConstraints vgrow="SOMETIMES" /> - <RowConstraints prefHeight="30.0" vgrow="SOMETIMES" /> - <RowConstraints prefHeight="30.0" vgrow="SOMETIMES" /> - <RowConstraints prefHeight="30.0" vgrow="SOMETIMES" /> - <RowConstraints prefHeight="30.0" vgrow="SOMETIMES" /> - <RowConstraints prefHeight="30.0" vgrow="SOMETIMES" /> - <RowConstraints prefHeight="30.0" vgrow="SOMETIMES" /> - </rowConstraints> - <padding> - <Insets left="10.0" right="10.0" top="10.0" /> - </padding> - <children> - <Label text="Sukunimi" /> - <TextField fx:id="kenttaSukunimi" GridPane.columnIndex="1" /> - <Label text="Etunimi" GridPane.rowIndex="1" /> - <TextField fx:id="kenttaEtunimi" GridPane.columnIndex="1" GridPane.hgrow="ALWAYS" GridPane.rowIndex="1" /> - <Label text="Syntymäaika" GridPane.rowIndex="2" /> - <Label text="Paikkakunta" GridPane.rowIndex="3" /> - <TextField fx:id="kenttaPaikkakunta" GridPane.columnIndex="1" GridPane.hgrow="ALWAYS" GridPane.rowIndex="3" /> - <Label text="Puhelinnumero" GridPane.rowIndex="4" /> - <TextField fx:id="kenttaPuh" GridPane.columnIndex="1" GridPane.rowIndex="4" /> - <Label text="Sähköposti" GridPane.rowIndex="5" /> - <TextField fx:id="kenttaEmail" GridPane.columnIndex="1" GridPane.rowIndex="5" /> - <Label text="Liittymisvuosi" GridPane.rowIndex="6" /> - <TextField fx:id="kenttaLVuosi" GridPane.columnIndex="1" GridPane.rowIndex="6" /> - <DatePicker fx:id="kenttaSyntymaAika" GridPane.columnIndex="1" GridPane.rowIndex="2" /> - </children> - </GridPane> - </center> -</BorderPane> diff --git a/src/fxHiihtorekisteri/LisaaHiihtajaGUIController.java b/src/fxHiihtorekisteri/LisaaHiihtajaGUIController.java deleted file mode 100644 index 680672d081d1ebdef98a0f47ef1af7fd980fa27e..0000000000000000000000000000000000000000 --- a/src/fxHiihtorekisteri/LisaaHiihtajaGUIController.java +++ /dev/null @@ -1,86 +0,0 @@ -package fxHiihtorekisteri; - -import fi.jyu.mit.fxgui.Dialogs; -import fi.jyu.mit.fxgui.ModalController; -import fi.jyu.mit.fxgui.ModalControllerInterface; -import fi.jyu.mit.ohj2.Mjonot; -import javafx.application.Platform; -import javafx.event.ActionEvent; -import javafx.fxml.FXML; -import javafx.scene.control.Button; -import javafx.scene.control.DatePicker; -import javafx.scene.control.TextField; - - -/** - * @author pohjo - * @version 13.1.2020 - * - */ -public class LisaaHiihtajaGUIController implements ModalControllerInterface<String> { - - @FXML - private Button nappiTallenna; - - @FXML - private Button nappiPeruuta; - - @FXML - private TextField kenttaSukunimi; - - @FXML - private TextField kenttaEtunimi; - - @FXML - private TextField kenttaPaikkakunta; - - @FXML - private TextField kenttaPuh; - - @FXML - private TextField kenttaEmail; - - @FXML - private TextField kenttaLVuosi; - - @FXML - private DatePicker kenttaSyntymaAika; - - @FXML - void handleTallenna() { - /** - Dialogs.showMessageDialog("Tallennus ei toimi vielä"); - String snimi = kenttaSukunimi.getText(); - String enimi = kenttaEtunimi.getText(); - String kunta = kenttaPaikkakunta.getText(); - int puh = Integer.parseInt(kenttaPuh.getText()); - String email = kenttaEmail.getText(); - int vuosi = Integer.parseInt(kenttaLVuosi.getText()); - String sAika = kenttaSyntymaAika.getPromptText(); - */ - } - - @FXML - void handlePeruuta() { - ModalController.closeStage(nappiPeruuta); - } - - @Override - public String getResult() { - // TODO Auto-generated method stub - return null; - } - - @Override - public void handleShown() { - // TODO Auto-generated method stub - - } - - @Override - public void setDefault(String oletus) { - // TODO Auto-generated method stub - - } - // -} \ No newline at end of file diff --git a/src/fxHiihtorekisteri/LisaaHiihtoGUIController.java b/src/fxHiihtorekisteri/LisaaHiihtoGUIController.java deleted file mode 100644 index ba8d9e9886a371bda699ee13c7c1b3ce9c249bd2..0000000000000000000000000000000000000000 --- a/src/fxHiihtorekisteri/LisaaHiihtoGUIController.java +++ /dev/null @@ -1,53 +0,0 @@ -package fxHiihtorekisteri; - -import fi.jyu.mit.fxgui.Dialogs; -import fi.jyu.mit.fxgui.ModalController; -import fi.jyu.mit.fxgui.ModalControllerInterface; -import javafx.application.Platform; -import javafx.event.ActionEvent; -import javafx.fxml.FXML; -import javafx.scene.control.Button; - - -/** - * @author pohjo - * @version 13.1.2020 - * - */ -public class LisaaHiihtoGUIController implements ModalControllerInterface<String> { - - @FXML - private Button nappiTallenna; - - @FXML - private Button nappiPeruuta; - - @FXML - void handleTallenna() { - Dialogs.showMessageDialog("Tallennus ei toimi vielä"); - } - - @FXML - void handlePeruuta() { - ModalController.closeStage(nappiPeruuta); - } - - @Override - public String getResult() { - // TODO Auto-generated method stub - return null; - } - - @Override - public void handleShown() { - // TODO Auto-generated method stub - - } - - @Override - public void setDefault(String oletus) { - // TODO Auto-generated method stub - - } - // -} \ No newline at end of file diff --git a/src/fxHiihtorekisteri/LisaaTietue.fxml b/src/fxHiihtorekisteri/LisaaTietue.fxml new file mode 100644 index 0000000000000000000000000000000000000000..0e54b524ca8fd4c23496a85b52fc6311d2ac4e55 --- /dev/null +++ b/src/fxHiihtorekisteri/LisaaTietue.fxml @@ -0,0 +1,71 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<?import javafx.geometry.Insets?> +<?import javafx.scene.control.Button?> +<?import javafx.scene.control.Label?> +<?import javafx.scene.control.TextField?> +<?import javafx.scene.layout.BorderPane?> +<?import javafx.scene.layout.ColumnConstraints?> +<?import javafx.scene.layout.GridPane?> +<?import javafx.scene.layout.HBox?> +<?import javafx.scene.layout.RowConstraints?> +<?import javafx.scene.layout.VBox?> + +<BorderPane xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="fxHiihtorekisteri.TietueGUIController"> + <bottom> + <HBox spacing="10.0" BorderPane.alignment="CENTER"> + <BorderPane.margin> + <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" /> + </BorderPane.margin> + <children> + <Button fx:id="nappiTallenna" onAction="#handleTallenna" text="Tallenna" /> + <Button fx:id="nappiPeruuta" alignment="CENTER" mnemonicParsing="false" onAction="#handlePeruuta" text="Peruuta" /> + <Label fx:id="labelVirhe" /> + </children> + </HBox> + </bottom> + <center> + <VBox BorderPane.alignment="CENTER"> + <children> + <GridPane fx:id="gridTietue" hgap="10.0"> + <columnConstraints> + <ColumnConstraints fillWidth="false" halignment="RIGHT" hgrow="SOMETIMES" /> + <ColumnConstraints hgrow="ALWAYS" maxWidth="550.000010172526" minWidth="69.33333841959634" /> + </columnConstraints> + <rowConstraints> + <RowConstraints vgrow="SOMETIMES" /> + <RowConstraints prefHeight="30.0" vgrow="SOMETIMES" /> + <RowConstraints prefHeight="30.0" vgrow="SOMETIMES" /> + <RowConstraints prefHeight="30.0" vgrow="SOMETIMES" /> + <RowConstraints prefHeight="30.0" vgrow="SOMETIMES" /> + <RowConstraints prefHeight="30.0" vgrow="SOMETIMES" /> + <RowConstraints prefHeight="30.0" vgrow="SOMETIMES" /> + </rowConstraints> + <padding> + <Insets left="10.0" right="10.0" top="10.0" /> + </padding> + <children> + <Label text="Etunimi" /> + <TextField fx:id="kenttaENimi" GridPane.columnIndex="1" /> + <Label text="Sukunimi" GridPane.rowIndex="1" /> + <TextField fx:id="kenttaSNimi" GridPane.columnIndex="1" GridPane.hgrow="ALWAYS" GridPane.rowIndex="1" /> + <Label text="Syntymäaika" GridPane.rowIndex="2" /> + <Label text="Paikkakunta" GridPane.rowIndex="3" /> + <TextField fx:id="kenttaPKunta" GridPane.columnIndex="1" GridPane.hgrow="ALWAYS" GridPane.rowIndex="3" /> + <Label text="Puhelinnumero" GridPane.rowIndex="4" /> + <TextField fx:id="kenttaPuh" GridPane.columnIndex="1" GridPane.rowIndex="4" /> + <Label text="Sähköposti" GridPane.rowIndex="5" /> + <TextField fx:id="kenttaEmail" GridPane.columnIndex="1" GridPane.rowIndex="5" /> + <Label text="Liittymisvuosi" GridPane.rowIndex="6" /> + <TextField fx:id="kenttaLVuosi" GridPane.columnIndex="1" GridPane.rowIndex="6" /> + <TextField fx:id="kenttaSAika" GridPane.columnIndex="1" GridPane.rowIndex="2" /> + </children> + </GridPane> + <Label fx:id="labelVirhe" prefHeight="43.0" prefWidth="228.0"> + <VBox.margin> + <Insets left="20.0" /> + </VBox.margin></Label> + </children> + </VBox> + </center> +</BorderPane> diff --git a/src/fxHiihtorekisteri/Muokkaa.fxml b/src/fxHiihtorekisteri/Muokkaa.fxml index 298b148f18aaf223bc931697e33e805d52237f85..829b6eca53507f192f42effbe3886c44bdc19d77 100644 --- a/src/fxHiihtorekisteri/Muokkaa.fxml +++ b/src/fxHiihtorekisteri/Muokkaa.fxml @@ -5,7 +5,6 @@ <?import javafx.scene.control.Button?> <?import javafx.scene.control.Label?> <?import javafx.scene.control.ScrollPane?> -<?import javafx.scene.control.TextField?> <?import javafx.scene.layout.BorderPane?> <?import javafx.scene.layout.ColumnConstraints?> <?import javafx.scene.layout.GridPane?> @@ -13,7 +12,7 @@ <?import javafx.scene.layout.RowConstraints?> <?import javafx.scene.layout.VBox?> -<BorderPane prefHeight="408.0" prefWidth="684.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="fxHiihtorekisteri.MuokkaaGUIController"> +<BorderPane prefHeight="408.0" prefWidth="684.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="fxHiihtorekisteri.TietueGUIController"> <bottom> <HBox spacing="10.0" BorderPane.alignment="CENTER"> <BorderPane.margin> @@ -22,6 +21,7 @@ <children> <Button fx:id="nappiTallenna" onAction="#handleTallenna" text="Tallenna" /> <Button fx:id="nappiPeruuta" alignment="CENTER" mnemonicParsing="false" onAction="#handlePeruuta" text="Peruuta" /> + <Button fx:id="nappiPoistaHiihto" mnemonicParsing="false" onAction="#handlePoistaHiihto" text="Poista hiihto" /> </children> </HBox> </bottom> @@ -30,15 +30,12 @@ <top> <VBox BorderPane.alignment="CENTER"> <children> - <VBox alignment="TOP_CENTER"> - <children> - <Label contentDisplay="CENTER" text="Hiihtäjän tiedot" textAlignment="CENTER" /> - </children> + <Label alignment="TOP_CENTER" contentDisplay="CENTER" text="Hiihtäjän tiedot" textAlignment="CENTER"> <VBox.margin> - <Insets top="10.0" /> + <Insets left="50.0" /> </VBox.margin> - </VBox> - <GridPane hgap="10.0" prefHeight="117.0" prefWidth="209.0"> + </Label> + <GridPane fx:id="gridTietue" hgap="10.0" prefHeight="117.0" prefWidth="209.0"> <columnConstraints> <ColumnConstraints fillWidth="false" halignment="RIGHT" hgrow="SOMETIMES" /> <ColumnConstraints hgrow="ALWAYS" maxWidth="140.00004069010416" minWidth="69.33333841959634" prefWidth="83.33335367838542" /> @@ -51,30 +48,25 @@ <RowConstraints prefHeight="30.0" vgrow="SOMETIMES" /> <RowConstraints prefHeight="30.0" vgrow="SOMETIMES" /> <RowConstraints prefHeight="30.0" vgrow="SOMETIMES" /> - <RowConstraints prefHeight="30.0" vgrow="SOMETIMES" /> </rowConstraints> <padding> <Insets left="10.0" right="10.0" top="10.0" /> </padding> <children> - <Label text="Sukunimi" /> - <TextField text="Nokka" GridPane.columnIndex="1" /> - <Label text="Etunimi" GridPane.rowIndex="1" /> - <TextField text="Räkä" GridPane.columnIndex="1" GridPane.hgrow="ALWAYS" GridPane.rowIndex="1" /> + <Label text="Etunimi" /> + <Label text="Sukunimi" GridPane.rowIndex="1" /> <Label text="Syntymäaika" GridPane.rowIndex="2" /> - <TextField text="01.08.1955" GridPane.columnIndex="1" GridPane.rowIndex="2" /> <Label text="Paikkakunta" GridPane.rowIndex="3" /> - <TextField text="Lahti" GridPane.columnIndex="1" GridPane.hgrow="ALWAYS" GridPane.rowIndex="3" /> <Label text="Puhelinnumero" GridPane.rowIndex="4" /> - <TextField text="0552012233" GridPane.columnIndex="1" GridPane.rowIndex="4" /> <Label text="Sähköposti" GridPane.rowIndex="5" /> - <TextField text="nr@niilot.fi" GridPane.columnIndex="1" GridPane.rowIndex="5" /> <Label text="Liittymisvuosi" GridPane.rowIndex="6" /> - <TextField text="1960" GridPane.columnIndex="1" GridPane.rowIndex="6" /> - <Label text="Km yhteensä" GridPane.rowIndex="7" /> - <TextField text="1200" GridPane.columnIndex="1" GridPane.rowIndex="7" /> </children> </GridPane> + <Label fx:id="labelVirhe" prefHeight="45.0" prefWidth="169.0"> + <VBox.margin> + <Insets left="20.0" /> + </VBox.margin> + </Label> </children> </VBox> </top> @@ -83,7 +75,7 @@ <center> <ScrollPane fitToWidth="true" prefHeight="421.0" prefWidth="353.0" BorderPane.alignment="CENTER"> <content> - <StringGrid minWidth="-Infinity" prefHeight="400.0" rivit="Pvm|Matka|Hiihtoaika|Lämpötila|Keskisyke|Maksimisyke|Kalorit 30.1.2020|20|2:30|-5|135|160|400" /> + <StringGrid fx:id="gridHiihdot" minWidth="-Infinity" prefHeight="400.0" rivit="Pvm|Matka| Aika|Lämpötila|Keskisyke|Maksimisyke|Kalorit " /> </content> </ScrollPane> </center> diff --git a/src/fxHiihtorekisteri/MuokkaaGUIController.java b/src/fxHiihtorekisteri/MuokkaaGUIController.java deleted file mode 100644 index 0ca7db1c5bb1743efbd4113e0c8bebe61304c019..0000000000000000000000000000000000000000 --- a/src/fxHiihtorekisteri/MuokkaaGUIController.java +++ /dev/null @@ -1,53 +0,0 @@ -package fxHiihtorekisteri; - -import fi.jyu.mit.fxgui.Dialogs; -import fi.jyu.mit.fxgui.ModalController; -import fi.jyu.mit.fxgui.ModalControllerInterface; -import javafx.application.Platform; -import javafx.event.ActionEvent; -import javafx.fxml.FXML; -import javafx.scene.control.Button; - - -/** - * @author pohjo - * @version 13.1.2020 - * - */ -public class MuokkaaGUIController implements ModalControllerInterface<String> { - - @FXML - private Button nappiTallenna; - - @FXML - private Button nappiPeruuta; - - @FXML - void handleTallenna() { - Dialogs.showMessageDialog("Tallennus ei toimi vielä"); - } - - @FXML - void handlePeruuta() { - ModalController.closeStage(nappiPeruuta); - } - - @Override - public String getResult() { - // TODO Auto-generated method stub - return null; - } - - @Override - public void handleShown() { - // TODO Auto-generated method stub - - } - - @Override - public void setDefault(String oletus) { - // TODO Auto-generated method stub - - } - // -} \ No newline at end of file diff --git a/src/fxHiihtorekisteri/Ohje.fxml b/src/fxHiihtorekisteri/Ohje.fxml index b6ebe7e9d18f1ea16e1112d55a88412fdcccef4e..a8f2330e6cdfcc54a97d0294d9c4de5989c86099 100644 --- a/src/fxHiihtorekisteri/Ohje.fxml +++ b/src/fxHiihtorekisteri/Ohje.fxml @@ -14,6 +14,6 @@ </Button> </bottom> <center> - <TextArea text="Käyttöohjeet Aloita lisäämällä omat henkilötietosi. Voit muokata ja poistaa henkilötietojasi jälkikäteen. Lisää oma hiihtotapahtuma “lisää hiihto†kohdasta. Voit syöttää kaikki ohjelman kysymät tiedot tai vain ne tiedot, jotka näet oleellisiksi. Voit muokata omia hiihtotapahtumiasi “muokkaa hiihtoa†kohdasta. Mikäli hiihtosi eivät mielytä, voit myös poistaa hiihtoja." wrapText="true" BorderPane.alignment="CENTER" /> + <TextArea text="Voit lisätä hiihtorekisteriin jäseniä yläpalkin painikkeesta "Lisää jäsen" tai pikakomennolla "Cntr+N". Lisää uusi hiihtotapahtuma valitsemallesi jäsenelle “Lisää hiihto†-painikkeesta. Voit syöttää kaikki ohjelman kysymät tiedot tai vain ne, jotka näet oleellisiksi. Voit muokata jäsenen tietoja ja hänen hiihtotapahtumiaan “Muokkaa" painikkeesta. Ylävalikon kautta voit myös poistaa jäseniä." wrapText="true" BorderPane.alignment="CENTER" /> </center> </BorderPane> diff --git a/src/fxHiihtorekisteri/OhjeGUIController.java b/src/fxHiihtorekisteri/OhjeGUIController.java index e0a7a738c34e56d0a84efd7bfbbf52fcf21bc305..ac5990993d8bc71cb17a71b5d3dc97aa2981f6bc 100644 --- a/src/fxHiihtorekisteri/OhjeGUIController.java +++ b/src/fxHiihtorekisteri/OhjeGUIController.java @@ -1,10 +1,7 @@ package fxHiihtorekisteri; -import fi.jyu.mit.fxgui.Dialogs; import fi.jyu.mit.fxgui.ModalController; import fi.jyu.mit.fxgui.ModalControllerInterface; -import javafx.application.Platform; -import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.scene.control.Button; diff --git a/src/fxHiihtorekisteri/PaaikkunaGUIView.fxml b/src/fxHiihtorekisteri/PaaikkunaGUIView.fxml index b882066ca01a345ecf1e5d5d03d31c8d880210e8..fbbb3100117604e97da9e04cbf47213444b64918 100644 --- a/src/fxHiihtorekisteri/PaaikkunaGUIView.fxml +++ b/src/fxHiihtorekisteri/PaaikkunaGUIView.fxml @@ -42,16 +42,34 @@ <accelerator> <KeyCodeCombination alt="UP" code="S" control="DOWN" meta="UP" shift="UP" shortcut="UP" /> </accelerator></MenuItem> - <MenuItem fx:id="ylanappiTulosta" mnemonicParsing="false" onAction="#handleTulosta" text="Tulosta" /> - <MenuItem fx:id="ylanappiLisaaHiihtaja" mnemonicParsing="false" onAction="#handleLisaaHiihtaja" text="Lisää hiihtäjä" /> - <MenuItem fx:id="ylanappiPoistaHiihtaja" mnemonicParsing="false" onAction="#handlePoistaHiihtaja" text="Poista hiihtäjä" /> - <MenuItem fx:id="ylanappiLopeta" mnemonicParsing="false" onAction="#handleLopeta" text="Lopeta" /> + <MenuItem fx:id="ylanappiTulosta" mnemonicParsing="false" onAction="#handleTulosta" text="Tulosta"> + <accelerator> + <KeyCodeCombination alt="UP" code="P" control="DOWN" meta="UP" shift="UP" shortcut="UP" /> + </accelerator></MenuItem> + <MenuItem fx:id="ylanappiLisaaHiihtaja" mnemonicParsing="false" onAction="#handleLisaaHiihtaja" text="Lisää hiihtäjä"> + <accelerator> + <KeyCodeCombination alt="UP" code="N" control="DOWN" meta="UP" shift="UP" shortcut="UP" /> + </accelerator></MenuItem> + <MenuItem fx:id="ylanappiPoistaHiihtaja" mnemonicParsing="false" onAction="#handlePoistaHiihtaja" text="Poista hiihtäjä"> + <accelerator> + <KeyCodeCombination alt="UP" code="D" control="DOWN" meta="UP" shift="UP" shortcut="UP" /> + </accelerator></MenuItem> + <MenuItem fx:id="ylanappiLopeta" mnemonicParsing="false" onAction="#handleLopeta" text="Lopeta"> + <accelerator> + <KeyCodeCombination alt="UP" code="X" control="DOWN" meta="UP" shift="UP" shortcut="UP" /> + </accelerator></MenuItem> </items> </Menu> <Menu mnemonicParsing="false" text="Ohje"> <items> - <MenuItem fx:id="ylanappiKayttoOhje" mnemonicParsing="false" onAction="#handleKayttoOhje" text="Käyttöohjeet" /> - <MenuItem fx:id="ylanappiTietoja" mnemonicParsing="false" onAction="#handleTietoja" text="Tietoja" /> + <MenuItem fx:id="ylanappiKayttoOhje" mnemonicParsing="false" onAction="#handleKayttoOhje" text="Käyttöohjeet"> + <accelerator> + <KeyCodeCombination alt="UP" code="H" control="DOWN" meta="UP" shift="UP" shortcut="UP" /> + </accelerator></MenuItem> + <MenuItem fx:id="ylanappiTietoja" mnemonicParsing="false" onAction="#handleTietoja" text="Tietoja"> + <accelerator> + <KeyCodeCombination alt="UP" code="I" control="DOWN" meta="UP" shift="UP" shortcut="UP" /> + </accelerator></MenuItem> </items> </Menu> </menus> @@ -77,17 +95,18 @@ <left> <VBox BorderPane.alignment="CENTER"> <children> - <ComboBoxChooser rivit="Nimi Paikkakunta " /> - <TextField fx:id="Hakukentta" onAction="#handleHaku" onKeyReleased="#handleHaku" prefHeight="0.0" prefWidth="200.0" /> + <ComboBoxChooser fx:id="cbKentat" onAction="#handleHakuehto" rivit="Nimi Paikkakunta " /> + <TextField fx:id="Hakuehto" onKeyReleased="#handleHakuehto" prefHeight="0.0" prefWidth="200.0" /> <Label contentDisplay="CENTER" text="Hiihtäjät" textAlignment="CENTER" wrapText="true" /> <ListChooser fx:id="chooserJasenet" maxHeight="100.0" maxWidth="300.0" rivit="nimi" /> <Label contentDisplay="CENTER" text="Hiihtäjän tiedot" textAlignment="CENTER" /> - <GridPane hgap="10.0" maxHeight="200.0"> + <GridPane hgap="10.0"> <columnConstraints> <ColumnConstraints fillWidth="false" halignment="RIGHT" hgrow="SOMETIMES" /> <ColumnConstraints hgrow="ALWAYS" maxWidth="140.00004069010416" minWidth="69.33333841959634" prefWidth="83.33335367838542" /> </columnConstraints> <rowConstraints> + <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> <RowConstraints vgrow="SOMETIMES" /> <RowConstraints prefHeight="30.0" vgrow="SOMETIMES" /> <RowConstraints prefHeight="30.0" vgrow="SOMETIMES" /> @@ -100,20 +119,22 @@ <Insets left="10.0" right="10.0" top="10.0" /> </padding> <children> - <Label text="Nimi" /> - <TextField fx:id="kenttaNimi" GridPane.columnIndex="1" /> - <Label text="Syntymäaika" GridPane.rowIndex="1" /> - <TextField fx:id="kenttaSAika" GridPane.columnIndex="1" GridPane.rowIndex="1" /> - <Label text="Paikkakunta" GridPane.rowIndex="2" /> - <TextField fx:id="kenttaPKunta" GridPane.columnIndex="1" GridPane.hgrow="ALWAYS" GridPane.rowIndex="2" /> - <Label text="Puhelinnumero" GridPane.rowIndex="3" /> - <TextField fx:id="kenttaPuh" GridPane.columnIndex="1" GridPane.rowIndex="3" /> - <Label text="Sähköposti" GridPane.rowIndex="4" /> - <TextField fx:id="kenttaEmail" GridPane.columnIndex="1" GridPane.rowIndex="4" /> - <Label text="Liittymisvuosi" GridPane.rowIndex="5" /> - <TextField fx:id="kenttaLVuosi" GridPane.columnIndex="1" GridPane.rowIndex="5" /> - <Label text="Km yhteensä" GridPane.rowIndex="6" /> - <TextField fx:id="kenttaKm" GridPane.columnIndex="1" GridPane.rowIndex="6" /> + <Label text="Etunimi" /> + <TextField fx:id="kenttaENimi" GridPane.columnIndex="1" /> + <Label text="Sukunimi" GridPane.rowIndex="1" /> + <TextField fx:id="kenttaSNimi" GridPane.columnIndex="1" GridPane.rowIndex="1" /> + <Label text="Syntymäaika" GridPane.rowIndex="2" /> + <TextField fx:id="kenttaSAika" GridPane.columnIndex="1" GridPane.rowIndex="2" /> + <Label text="Paikkakunta" GridPane.rowIndex="3" /> + <TextField fx:id="kenttaPKunta" GridPane.columnIndex="1" GridPane.hgrow="ALWAYS" GridPane.rowIndex="3" /> + <Label text="Puhelinnumero" GridPane.rowIndex="4" /> + <TextField fx:id="kenttaPuh" GridPane.columnIndex="1" GridPane.rowIndex="4" /> + <Label text="Sähköposti" GridPane.rowIndex="5" /> + <TextField fx:id="kenttaEmail" GridPane.columnIndex="1" GridPane.rowIndex="5" /> + <Label text="Liittymisvuosi" GridPane.rowIndex="6" /> + <TextField fx:id="kenttaLVuosi" GridPane.columnIndex="1" GridPane.rowIndex="6" /> + <Label text="Km yhteensä" GridPane.rowIndex="7" /> + <TextField fx:id="kenttaKm" GridPane.columnIndex="1" GridPane.rowIndex="7" /> </children> </GridPane> </children> diff --git a/src/fxHiihtorekisteri/TietojaGUIController.java b/src/fxHiihtorekisteri/TietojaGUIController.java index 0a9000df9cf6663fe9e8bff718cf23feec2eb423..96a259da5a81049d20cc79677fa0b818d1187b0f 100644 --- a/src/fxHiihtorekisteri/TietojaGUIController.java +++ b/src/fxHiihtorekisteri/TietojaGUIController.java @@ -1,10 +1,7 @@ package fxHiihtorekisteri; -import fi.jyu.mit.fxgui.Dialogs; import fi.jyu.mit.fxgui.ModalController; import fi.jyu.mit.fxgui.ModalControllerInterface; -import javafx.application.Platform; -import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.scene.control.Button; @@ -16,30 +13,21 @@ import javafx.scene.control.Button; */ public class TietojaGUIController implements ModalControllerInterface<String> { - @FXML - private Button nappiSulje; + @FXML private Button nappiSulje; - @FXML - void handleSulje() { + @FXML void handleSulje() { ModalController.closeStage(nappiSulje); } - @Override - public String getResult() { - // TODO Auto-generated method stub + @Override public String getResult() { return null; } - @Override - public void handleShown() { + @Override public void handleShown() { // TODO Auto-generated method stub - } - @Override - public void setDefault(String oletus) { + @Override public void setDefault(String oletus) { // TODO Auto-generated method stub - } - // } \ No newline at end of file diff --git a/src/fxHiihtorekisteri/TietueGUIController.java b/src/fxHiihtorekisteri/TietueGUIController.java new file mode 100644 index 0000000000000000000000000000000000000000..a894227ea4a741311b7b2290ccf6b18c4b596410 --- /dev/null +++ b/src/fxHiihtorekisteri/TietueGUIController.java @@ -0,0 +1,302 @@ +package fxHiihtorekisteri; + +import java.net.URL; +import java.util.ArrayList; +import java.util.ResourceBundle; + +import Tietorakenteet.Rekisteri; +import Tietorakenteet.SailoException; +import Tietorakenteet.Hiihto; +import Tietorakenteet.Tietue; +import fi.jyu.mit.fxgui.Dialogs; +import fi.jyu.mit.fxgui.ModalController; +import fi.jyu.mit.fxgui.ModalControllerInterface; +import fi.jyu.mit.fxgui.StringGrid; +import fi.jyu.mit.ohj2.Mjonot; +import javafx.fxml.FXML; +import javafx.fxml.Initializable; +import javafx.scene.Node; +import javafx.scene.control.Button; +import javafx.scene.control.Label; +import javafx.scene.control.TextField; +import javafx.scene.layout.GridPane; +import javafx.stage.Stage; + + +/** + * Kysytään tietueen tiedot + * @author MHo + * @version 13.1.2020 + * @param <TYPE> Tietueen tyyppi + * + */ + public class TietueGUIController<TYPE extends Tietue> implements ModalControllerInterface<TYPE>,Initializable { + + @FXML private Button nappiTallenna; + @FXML private Button nappiPeruuta; + @FXML private Button nappiPoistaHiihto; + @FXML private GridPane gridTietue; + @FXML private Label labelVirhe; + @FXML private StringGrid<Hiihto> gridHiihdot; + + private TextField[] kentat; + private TYPE tietueKohdalla; + private Rekisteri rekisteri; + + @FXML void handleTallenna() { + if ( tietueKohdalla != null && !labelVirhe.getText().equals("")) return; + if (tietueKohdalla.getNimi().equals(" ")) { + Dialogs.showMessageDialog("Anna etu- tai sukunimi"); + return; + } + if (kentat[0].getText().equals("") || kentat[1].getText().equals("")) { + Dialogs.showMessageDialog("Anna päivämäärä ja matka"); + return; + } + ModalController.closeStage(nappiTallenna); + } + + @FXML void handlePeruuta() { + tietueKohdalla = null; + ModalController.closeStage(nappiPeruuta); + } + + @FXML void handlePoistaHiihto() { + if (poistaHiihto() == true) { + naytaHiihdot(); + Dialogs.showMessageDialog("Valitsemasi hiihto on poistettu"); + } + else Dialogs.showMessageDialog("Hiihtoa ei valittu"); + + } + + @Override + public void initialize(URL arg0, ResourceBundle arg1) { + // TODO Auto-generated method stub + } + + @Override + public void setDefault(TYPE oletus) { + tietueKohdalla = oletus; + } + + @Override + public TYPE getResult() { + return tietueKohdalla; + } + + @Override + public void handleShown() { + // + } + + + /** + * Tekee tarvittavat alustukset + */ + protected void alusta() { + kentat = luoKentat(gridTietue, tietueKohdalla); + //tyhjenna(kentat); + for (TextField kentta : kentat) { + if ( kentta != null) + kentta.setOnKeyReleased( e -> kasitteleMuutosTietueeseen((TextField)(e.getSource()))); + } + } + + + /** Tyhjennetään tekstikentät + * @param kentat taulukko tyhjennettävistä teksikentistä + */ + public static void tyhjenna(TextField[] kentat) { + for (TextField kentta : kentat) if (kentta != null) kentta.setText(""); + } + + + /** + * Luodaan GridPaneen tietueen tiedot + * @param gridTietue mihin tiedot luodaan + * @param tietue tietue, jonka tiedoilla luodaan kentät + * @return luodut tekstikentät + */ + public static<TYPE extends Tietue> TextField[] luoKentat(GridPane gridTietue, TYPE tietue) { + gridTietue.getChildren().clear(); + TextField[] edits = new TextField[tietue.getKenttia()]; + + for (int i = 0, k = 1; k <= tietue.getKenttia(); k++, i++) { + Label label = new Label(tietue.getKysymys(k)); + gridTietue.add(label, 0, i); + + TextField edit = new TextField(); + edit.setText(tietue.anna(k)); + edits[i] = edit; + edit.setId("e"+k); + gridTietue.add(edit, 1, i); + } + return edits; + } + + + /** + * @param kentat teksikentät, joissa tiedot näytetään + * @param t tietue jonka tiedot näytetään + */ + public static void naytaTietue(TextField[] kentat, Tietue t) { + if (t == null) return; + int i = 0; + for (int k = 1; k <= t.getKenttia(); k++) { + kentat[i].setText(t.anna(k)); + i++; + } + } + + + /** + * Näyttää listasta valitun jäsenen hiihdot + */ + protected void naytaHiihdot() { + gridHiihdot.clear(); + ArrayList<Hiihto> jasenenHiihdot = rekisteri.getJasenenHiihdot(tietueKohdalla.getID()); + for (int i = 0; i < jasenenHiihdot.size(); i++) { + String[] rivi = jasenenHiihdot.get(i).getTiedot(); + gridHiihdot.add(jasenenHiihdot.get(i), rivi); + } + gridHiihdot.setOnMouseClicked( e -> { if ( e.getClickCount() > 1 ) muokkaaHiihtoa(); } ); + } + + + /** + * Muokataan valittuna olevaa hiihtosuoritusta. + */ + private void muokkaaHiihtoa() { + int r = gridHiihdot.getRowNr(); + if ( r < 0 ) return; // klikattu ehkä otsikkoriviä + Hiihto h = gridHiihdot.getObject(); + if ( h == null ) return; + //nt k = gridHiihdot.getColumnNr()+h.ekaKentta(); + try { + h = TietueGUIController.kysyTietue(null, h.clone()); + if ( h == null ) return; + rekisteri.korvaaTaiLisaa(h); + naytaHiihdot(); //tietueKohdalla + gridHiihdot.selectRow(r); // järjestetään sama rivi takaisin valituksi + } catch (CloneNotSupportedException e) { + // + } catch (SailoException e) { + Dialogs.showMessageDialog("Ongelmia lisäämisessä: " + e.getMessage()); + } + } + + + /** + * Poistetaan valittu hiihto reksiteristä + * @return true jos poisto onnistui + */ + private boolean poistaHiihto() { + int r = gridHiihdot.getRowNr(); + if ( r < 0 ) return false; // klikattu ehkä otsikkoriviä + Hiihto h = gridHiihdot.getObject(); + if ( h == null ) return false; + + if ( !Dialogs.showQuestionDialog("Poisto", "Poistetaanko hiihto", "Kyllä", "Ei") ) + return false; + rekisteri.poistaHiihto(h); + return true; + } + + + /** + * Käsitellään jäseneen tullut muutos + * @param edit muuttunut kenttä + */ + private void kasitteleMuutosTietueeseen(TextField edit) { + if (tietueKohdalla == null) return; + int k = getFieldId(edit, tietueKohdalla.ekaKentta()); + String s = edit.getText(); + String virhe = null; + //if (s.equals("")) return; + virhe = tietueKohdalla.aseta(k,s); + if (virhe == null) { + Dialogs.setToolTipText(edit,""); + edit.getStyleClass().removeAll("virhe"); + naytaVirhe(virhe); + } else { + Dialogs.setToolTipText(edit,virhe); + edit.getStyleClass().add("virhe"); + naytaVirhe(virhe); + } + } + + + /** + * Palautetaan komponentin id:stä saatava luku + * @param obj tutkittava komponentti + * @param oletus mikä arvo jos id ei ole kunnollinen + * @return komponentin id lukuna + */ + public static int getFieldId(Object obj, int oletus) { + if ( !( obj instanceof Node)) return oletus; + Node node = (Node)obj; + return Mjonot.erotaInt(node.getId().substring(1),oletus); + } + + + /** + * Näyttää virheilmoitukset + * @param virhe joka näytetään + */ + private void naytaVirhe(String virhe) { + if ( virhe == null || virhe.isEmpty() ) { + labelVirhe.setText(""); + labelVirhe.getStyleClass().removeAll("virhe"); + return; + } + labelVirhe.setText(virhe); + labelVirhe.getStyleClass().add("virhe"); + } + + + /** + * Luodaan jäsenen kysymisdialogi ja palautetaan sama tietue muutettuna tai null + * TODO: korjattava toimimaan + * @param <TYPE> tietueen tyyppi + * @param modalityStage mille ollaan modaalisia, null = sovellukselle + * @param oletus mitä dataan näytetään oletuksena + * @return null jos painetaan Cancel, muuten täytetty tietue + */ + public static<TYPE extends Tietue> TYPE kysyTietue(Stage modalityStage, TYPE oletus) { + return ModalController.<TYPE, TietueGUIController<TYPE>>showModal( + TietueGUIController.class.getResource("LisaaTietue.fxml"), + "Hiihtorekisteri", + modalityStage, oletus, ctrl -> ctrl.alusta() + ); + } + + + /** + * @param <TYPE> tietueen tyyppi + * @param modalityStage modaalisia, null = sovellukselle + * @param oletus mitä näytetään oletuksena + * @param r käytettävä rekisteri + * @return valittu hiihto + */ + public static<TYPE extends Tietue> TYPE kysyTietue(Stage modalityStage, TYPE oletus, Rekisteri r) { + return ModalController.<TYPE, TietueGUIController<TYPE>>showModal( + TietueGUIController.class.getResource("Muokkaa.fxml"), + "Hiihtorekisteri", + modalityStage, oletus, + ctrl -> ctrl.setRekisteri(r) + ); + } + + + /** + * Asetetaan rekisteri + * @param rek asetettava rekisteri + */ + public void setRekisteri(Rekisteri rek) { + rekisteri = rek; + alusta(); + naytaTietue(kentat, tietueKohdalla); + if (gridHiihdot != null) naytaHiihdot(); + } +} \ No newline at end of file diff --git a/src/fxHiihtorekisteri/Tulosta.fxml b/src/fxHiihtorekisteri/Tulosta.fxml index 925c6ecc8fed5fd249457263cfbbb36418a43906..83ad8755c95def83a632d0e8722663802e5a3fd6 100644 --- a/src/fxHiihtorekisteri/Tulosta.fxml +++ b/src/fxHiihtorekisteri/Tulosta.fxml @@ -1,9 +1,8 @@ <?xml version="1.0" encoding="UTF-8"?> -<?import fi.jyu.mit.fxgui.StringGrid?> <?import javafx.geometry.Insets?> <?import javafx.scene.control.Button?> -<?import javafx.scene.control.ScrollPane?> +<?import javafx.scene.control.TextArea?> <?import javafx.scene.layout.BorderPane?> <?import javafx.scene.layout.HBox?> <?import javafx.scene.layout.VBox?> @@ -28,10 +27,6 @@ </BorderPane> </left> <center> - <ScrollPane fitToWidth="true" prefHeight="421.0" prefWidth="353.0" BorderPane.alignment="CENTER"> - <content> - <StringGrid minWidth="-Infinity" prefHeight="400.0" rivit="Pvm|Matka|Hiihtoaika|Lämpötila|Keskisyke|Maksimisyke|Kalorit 30.1.2020|20|2:30|-5|135|160|400" /> - </content> - </ScrollPane> + <TextArea fx:id="tulostusAlue" prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER" /> </center> </BorderPane> diff --git a/src/fxHiihtorekisteri/TulostaGUIController.java b/src/fxHiihtorekisteri/TulostaGUIController.java index 691d263a2bcbb51e8e41c9c9a2fdbe01eadedc0e..63bc35a39529422f05ba6dbd5523fb5c615bc9cd 100644 --- a/src/fxHiihtorekisteri/TulostaGUIController.java +++ b/src/fxHiihtorekisteri/TulostaGUIController.java @@ -1,53 +1,91 @@ package fxHiihtorekisteri; +import java.io.PrintStream; +import java.util.ArrayList; + +import Tietorakenteet.Hiihto; +import Tietorakenteet.Jasen; +import Tietorakenteet.Rekisteri; import fi.jyu.mit.fxgui.Dialogs; import fi.jyu.mit.fxgui.ModalController; import fi.jyu.mit.fxgui.ModalControllerInterface; -import javafx.application.Platform; -import javafx.event.ActionEvent; +import fi.jyu.mit.fxgui.TextAreaOutputStream; import javafx.fxml.FXML; +import javafx.print.PrinterJob; import javafx.scene.control.Button; - +import javafx.scene.control.TextArea; +import javafx.scene.web.WebEngine; /** - * @author pohjo + * @author MHo * @version 13.1.2020 - * */ -public class TulostaGUIController implements ModalControllerInterface<String> { +public class TulostaGUIController implements ModalControllerInterface<Jasen> { - @FXML - private Button nappiTulosta; + @FXML private TextArea tulostusAlue; + @FXML private Button nappiTulosta; + @FXML private Button nappiPeruuta; - @FXML - private Button nappiPeruuta; - - @FXML - void handleTulosta() { - Dialogs.showMessageDialog("Tulostus ei toimi vielä"); + private Rekisteri rekisteri; + private Jasen jasen; + + @FXML void handleTulosta() { + PrinterJob job = PrinterJob.createPrinterJob(); + if ( job != null && job.showPrintDialog(null) ) { + WebEngine webEngine = new WebEngine(); + webEngine.loadContent("<pre>" + tulostusAlue.getText() + "</pre>"); + webEngine.print(job); + job.endJob(); + } } - @FXML - void handlePeruuta() { + @FXML void handlePeruuta() { ModalController.closeStage(nappiPeruuta); } - @Override - public String getResult() { - // TODO Auto-generated method stub + @Override public Jasen getResult() { return null; } + + @Override public void handleShown() { + // + } - @Override - public void handleShown() { - // TODO Auto-generated method stub - + @Override public void setDefault(Jasen oletus) { + jasen = oletus; + } + + /** + * @param r rekisteri jota käytetään + * + */ + public void setRekisteri(Rekisteri r) { + rekisteri = r; + tulosta(tulostusAlue); + } + + /** + * @param t alue johon tulostetaan + */ + public void tulosta(TextArea t) { + try (PrintStream os = TextAreaOutputStream.getTextPrintStream(t)) { + os.println("Tulostetaan kaikki hiihdot"); + ArrayList<Hiihto> jasenenHiihdot = rekisteri.getJasenenHiihdot(jasen.getID()); + for (Hiihto h : jasenenHiihdot) { + h.tulosta(os); + os.println("\n"); + } + } } - @Override - public void setDefault(String oletus) { - // TODO Auto-generated method stub - + + /** + * Näyttää tulostusalueessa tekstin + * @param j jäsen jonka hiihdot tulostetaan + * @param r rekisteri jota käytetään + */ + public static void tulosta(Jasen j, Rekisteri r) { + ModalController.<Jasen, TulostaGUIController>showModal(TulostaGUIController.class.getResource("Tulosta.fxml"), + "Tulostus", null, j, ctrl -> ctrl.setRekisteri(r)); } - // } \ No newline at end of file