From 4ad9ceff0054b0cc6350d713bcc4316b0450c497 Mon Sep 17 00:00:00 2001
From: mvholmsy <mvholmsy@student.jyu.fi>
Date: Fri, 21 Feb 2020 13:20:30 +0200
Subject: [PATCH] Vaihe 5.1

---
 src/Tietorakenteet/Jasen.java                 |  79 ++++++++++++
 src/Tietorakenteet/Jasenet.java               | 122 ++++++++++++++++++
 src/Tietorakenteet/Rekisteri.java             |  93 +++++++++++++
 src/Tietorakenteet/SailoException.java        |  20 +++
 .../HiihtorekisteriGUIController.java         |  78 ++++++++++-
 .../HiihtorekisteriMain.java                  |  13 +-
 src/fxHiihtorekisteri/LisaaHiihtaja.fxml      |  14 +-
 .../LisaaHiihtajaGUIController.java           |  33 +++++
 src/fxHiihtorekisteri/PaaikkunaGUIView.fxml   |   4 +-
 9 files changed, 444 insertions(+), 12 deletions(-)
 create mode 100644 src/Tietorakenteet/Jasen.java
 create mode 100644 src/Tietorakenteet/Jasenet.java
 create mode 100644 src/Tietorakenteet/Rekisteri.java
 create mode 100644 src/Tietorakenteet/SailoException.java

diff --git a/src/Tietorakenteet/Jasen.java b/src/Tietorakenteet/Jasen.java
new file mode 100644
index 0000000..6c818f4
--- /dev/null
+++ b/src/Tietorakenteet/Jasen.java
@@ -0,0 +1,79 @@
+package Tietorakenteet;
+
+import java.io.OutputStream;
+import java.io.PrintStream;
+
+/**
+ * @author MHo
+ * @version 20.2.2020
+ * Jasen -luokka, joka lisää jäsenen rekisteriin.
+ */
+public class Jasen {
+    private int id;
+    private String nimi = "";
+    private String syntAika = "";
+    private String pKunta = "";
+    private int puh;
+    private String sPosti = "";
+    private int liittymisV;
+    
+    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 = 1980;
+        juoksevaNro++;
+    }
+    
+    
+    /**
+     * @return jäsenen nimi
+     */
+    public String getNimi(){
+        return nimi;
+    }
+    
+    /**
+     * @return jäsenen ID-numero
+     */
+    public int getID() {
+        return id;
+    }
+    
+    /**
+     * Tulostetaan henkilön tiedot
+     * @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 + ".");
+    }
+    
+    
+    /**
+     * Tulostetaan henkilön tiedot
+     * @param os tietovirta johon tulostetaan
+     */
+    public void tulosta(OutputStream os) {
+        tulosta(new PrintStream(os));
+    }
+
+    
+    /**
+     * @param args ei käytössä
+     */
+    public static void main(String args[]) {
+        Jasen nokka = new Jasen();
+        nokka.tulosta(System.out);
+    }
+}
\ No newline at end of file
diff --git a/src/Tietorakenteet/Jasenet.java b/src/Tietorakenteet/Jasenet.java
new file mode 100644
index 0000000..5a363f7
--- /dev/null
+++ b/src/Tietorakenteet/Jasenet.java
@@ -0,0 +1,122 @@
+package Tietorakenteet;
+
+/**
+ * @author MHo
+ * @version 20.2.2020
+ * Hiihtorekisterin jasenet, joka lisää ja poistaa jäseniä.
+ */
+public class Jasenet {
+    private static final int MAX_JASENIA = 10;
+    private int lkm = 0;
+    private String tiedostonNimi = "";
+    private Jasen alkiot[] = new Jasen[MAX_JASENIA];
+    //private ArrayList<Jasen> jasenisto = new ArrayList<Jasen>();
+    
+    
+    /**
+     * Muodostaja
+     */
+    public Jasenet(){
+       //
+    }
+    
+    
+    /**
+     * Lisää uuden jäsenen tietorakenteeseen.  Ottaa jäsenen omistukseensa.
+     * @param jasen lisätäävän jäsenen viite.  Huom tietorakenne muuttuu omistajaksi
+     * @throws SailoException jos tietorakenne on jo täynnä
+     * @example
+     * <pre name="test">
+     * #THROWS SailoException 
+     * Jasenet jasenet = new Jasenet();
+     * Jasen aku1 = new Jasen(), aku2 = new Jasen();
+     * jasenet.getLkm() === 0;
+     * jasenet.lisaa(aku1); jasenet.getLkm() === 1;
+     * jasenet.lisaa(aku2); jasenet.getLkm() === 2;
+     * jasenet.lisaa(aku1); jasenet.getLkm() === 3;
+     * jasenet.anna(0) === aku1;
+     * jasenet.anna(1) === aku2;
+     * jasenet.anna(2) === aku1;
+     * jasenet.anna(1) == aku1 === false;
+     * jasenet.anna(1) == aku2 === true;
+     * jasenet.anna(3) === aku1; #THROWS IndexOutOfBoundsException 
+     * jasenet.lisaa(aku1); jasenet.getLkm() === 4;
+     * jasenet.lisaa(aku1); jasenet.getLkm() === 5;
+     * jasenet.lisaa(aku1);  #THROWS SailoException
+     * </pre>
+     */
+    public void lisaa(Jasen jasen) throws SailoException {
+        if (lkm >= alkiot.length) throw new SailoException("Liikaa alkioita");
+        alkiot[lkm] = jasen;
+        //jasenisto.add(jasen);
+        lkm++;
+    }
+    
+    
+    /**
+     * Palauttaa viitteen i:teen jäseneen.
+     * @param i monennenko jäsenen viite halutaan
+     * @return viite jäseneen, jonka indeksi on i
+     * @throws IndexOutOfBoundsException jos i ei ole sallitulla alueella  
+     */
+    public Jasen anna(int i) throws IndexOutOfBoundsException {
+        if (i < 0 || lkm <= i)
+            throw new IndexOutOfBoundsException("Laiton indeksi: " + i);
+        return alkiot[i];
+    }
+    
+    
+    /**
+     * Lukee jäsenistön tiedostosta.  Kesken.
+     * @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);
+    }
+
+
+    /**
+     * Tallentaa jäsenistön tiedostoon.  Kesken.
+     * @throws SailoException jos talletus epäonnistuu
+     */
+    public void talleta() throws SailoException {
+        throw new SailoException("Ei osata vielä tallettaa tiedostoa " + tiedostonNimi);
+    }
+
+
+    /**
+     * Palauttaa kerhon jäsenten lukumäärän
+     * @return jäsenten lukumäärä
+     */
+    public int getLkm() {
+        return lkm;
+    }
+    
+    
+    /**
+     * @param args ei käytössä
+     */
+    public static void main(String args[]) {
+        Jasenet jasenet = new Jasenet();
+
+        Jasen nokka = new Jasen(), raka = new Jasen();
+
+        try {
+            jasenet.lisaa(nokka);
+            jasenet.lisaa(raka);
+
+            System.out.println("========== Jäsenet testi ==============");
+
+            for (int i=0; i<jasenet.getLkm(); i++) {
+                Jasen jasen = jasenet.anna(i);
+                System.out.println("Jäsen nro: " + i);
+                jasen.tulosta(System.out);
+            }
+
+        } catch ( Exception ex ) {
+            System.out.println(ex.getMessage());
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/Tietorakenteet/Rekisteri.java b/src/Tietorakenteet/Rekisteri.java
new file mode 100644
index 0000000..c343e6d
--- /dev/null
+++ b/src/Tietorakenteet/Rekisteri.java
@@ -0,0 +1,93 @@
+package Tietorakenteet;
+
+import java.util.*;
+
+/**
+ * @author MHo
+ * @version 20.2.2020
+ * Hiihtorekisterin jasenet, joka lisää ja poistaa jäseniä.
+ */
+public class Rekisteri {
+    private  final Jasenet jasenet = new Jasenet();
+    
+    
+    /**
+     * Muodostaja
+     */
+    public Rekisteri(){
+    }
+    
+    
+    /**
+     * Lisää jäsenen listaan.
+     * @param jasen lisättävän jäsenen viite
+     * @throws SailoException jos lisäystä ei voida tehdä 
+     */
+    public void lisaa(Jasen jasen) throws SailoException {
+        jasenet.lisaa(jasen);
+    }
+    
+    
+    /**
+     * @param i monennenko jäsenen viite haetaan
+     * @return viite jäseneen, jonka indeksi on i
+     */
+    public Jasen annaJasen(int i) {
+        return jasenet.anna(i);
+    }
+    
+    
+    /**
+     * Lukee jäsenistön tiedostosta. TODO lukeminen tiedostosta
+     * @param nimi jota käytetään lukemisessa
+     * @throws SailoException jos lukeminen epäonnistuu
+     */
+    public void lueTiedostosta(String nimi) throws SailoException {
+        jasenet.lueTiedostosta(nimi);
+    }
+    
+    
+    /**
+     * Poistaa jäsenet ja hiihdot, joilla on annettu nro
+     * TODO jäsenien ja hiihtojen poisto ko. luokista. 
+     * @throws SailoException jos tallettamisessa ongelmia
+     */
+    public void talleta() throws SailoException{
+        jasenet.talleta();
+    }
+    
+    
+    /**
+     * @return jäsenistön lkm
+     */
+    public int getLkm() {
+        return jasenet.getLkm();
+    }
+    /**
+     * @param args ei käytössä
+     */
+    public static void main(String args[]) {
+        Rekisteri rekisteri = new Rekisteri();
+        
+        try {
+            // kerho.lueTiedostosta("kelmit");
+
+            Jasen nokkaraka = new Jasen(), mietaa = new Jasen();
+            
+
+            rekisteri.lisaa(nokkaraka);
+            rekisteri.lisaa(mietaa);
+
+            System.out.println("============= Kerhon testi =================");
+
+            for (int i = 0; i < rekisteri.getLkm(); i++) {
+                Jasen jasen = rekisteri.annaJasen(i);
+                System.out.println("Jäsen paikassa: " + i);
+                jasen.tulosta(System.out);
+            }
+
+        } catch (Exception ex) {
+            System.out.println(ex.getMessage());
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/Tietorakenteet/SailoException.java b/src/Tietorakenteet/SailoException.java
new file mode 100644
index 0000000..e77f57f
--- /dev/null
+++ b/src/Tietorakenteet/SailoException.java
@@ -0,0 +1,20 @@
+  package Tietorakenteet;
+  
+  /**
+   * Poikkeusluokka tietorakenteesta aiheutuville poikkeuksille.
+   * @author Vesa Lappalainen
+   * @version 1.0, 22.02.2003
+   */
+  public class SailoException extends Exception {
+      private static final long serialVersionUID = 1L;
+  
+  
+      /**
+       * Poikkeuksen muodostaja jolle tuodaan poikkeuksessa
+       * käytettävä viesti
+       * @param viesti Poikkeuksen viesti
+       */
+      public SailoException(String viesti) {
+          super(viesti);
+      }
+  }
\ No newline at end of file
diff --git a/src/fxHiihtorekisteri/HiihtorekisteriGUIController.java b/src/fxHiihtorekisteri/HiihtorekisteriGUIController.java
index e6ae8da..8ee006a 100644
--- a/src/fxHiihtorekisteri/HiihtorekisteriGUIController.java
+++ b/src/fxHiihtorekisteri/HiihtorekisteriGUIController.java
@@ -1,11 +1,19 @@
 package fxHiihtorekisteri;
 
+import java.io.PrintStream;
+
+import Tietorakenteet.Jasen;
+import Tietorakenteet.Rekisteri;
+import Tietorakenteet.SailoException;
 import fi.jyu.mit.fxgui.Dialogs;
+import fi.jyu.mit.fxgui.ListChooser;
 import fi.jyu.mit.fxgui.ModalController;
+import fi.jyu.mit.fxgui.TextAreaOutputStream;
 import javafx.event.ActionEvent;
 import javafx.fxml.FXML;
 import javafx.scene.control.Button;
 import javafx.scene.control.MenuItem;
+import javafx.scene.control.TextArea;
 import javafx.scene.control.TextField;
 
 
@@ -48,7 +56,42 @@ public class HiihtorekisteriGUIController {
 
     @FXML
     private MenuItem ylanappiTietoja;
+    
+    @FXML
+    private ListChooser<Jasen> chooserJasenet;
+    
+    @FXML
+    private TextArea textAreaJasen;
+    
+    private Rekisteri rekisteri;
+    private Jasen jasenKohdalla;
+
+    
+    /**
+     * @param rekisteri jota käytetään
+     */
+    public void setRekisteri(Rekisteri rekisteri) {
+        this.rekisteri = rekisteri;
+        alusta();
+        naytaJasen();
+    }
+
+    
+    /**
+     * Näyttää listasta valitun jäsenen tiedot, tilapäisesti yhteen isoon edit-kenttään
+     */
+    protected void naytaJasen() {
+        jasenKohdalla = chooserJasenet.getSelectedObject();
 
+        if (jasenKohdalla == null) return;
+        jasenKohdalla.tulosta(System.out);
+        textAreaJasen.setText("");
+        try (PrintStream os = TextAreaOutputStream.getTextPrintStream(textAreaJasen)) {
+            jasenKohdalla.tulosta(os);
+        }
+    }
+
+    
     @FXML
     void handleHaku() {
         //
@@ -71,7 +114,14 @@ public class HiihtorekisteriGUIController {
     
     @FXML
     void handleLisaaHiihtaja() {
-        ModalController.showModal(HiihtorekisteriGUIController.class.getResource("LisaaHiihtaja.fxml"), "Hiihtaja", null, "");
+        try {
+            rekisteri.lisaa(new Jasen());
+        } catch (SailoException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+        //ModalController.showModal(HiihtorekisteriGUIController.class.getResource("LisaaHiihtaja.fxml"), "Hiihtaja", null, "");
+        hae(0);
     }
     
     @FXML
@@ -98,4 +148,30 @@ public class HiihtorekisteriGUIController {
     void handleTietoja() {
         ModalController.showModal(HiihtorekisteriGUIController.class.getResource("Tietoja.fxml"), "Tietoja", null, "");
     }
+    
+    
+    /**
+     * 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);
+        }
+        chooserJasenet.setSelectedIndex(index); // tästä tulee muutosviesti joka näyttää jäsenen
+    }
+
+    
+    /**
+     * Alustaa listan jäsenistä
+     */
+    protected void alusta() {
+        chooserJasenet.clear();
+        chooserJasenet.addSelectionListener(e -> naytaJasen());
+    }
 }
\ No newline at end of file
diff --git a/src/fxHiihtorekisteri/HiihtorekisteriMain.java b/src/fxHiihtorekisteri/HiihtorekisteriMain.java
index c74245d..fdcab47 100644
--- a/src/fxHiihtorekisteri/HiihtorekisteriMain.java
+++ b/src/fxHiihtorekisteri/HiihtorekisteriMain.java
@@ -1,8 +1,10 @@
 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;
 
 /**
@@ -14,11 +16,16 @@ public class HiihtorekisteriMain extends Application {
 	@Override
 	public void start(Stage primaryStage) {
 		try {
-			BorderPane root = (BorderPane)FXMLLoader.load(getClass().getResource("PaaikkunaGUIView.fxml"));
-			Scene scene = new Scene(root);
+		    final FXMLLoader ldr = new FXMLLoader(getClass().getResource("PaaikkunaGUIView.fxml"));
+            final Pane root = (Pane)ldr.load();
+		    final HiihtorekisteriGUIController rekisteriCtrl = (HiihtorekisteriGUIController)ldr.getController();
+			final Scene scene = new Scene(root);
 			scene.getStylesheets().add(getClass().getResource("hiihtorekisteri.css").toExternalForm());
 			primaryStage.setScene(scene);
+			Rekisteri rekisteri = new Rekisteri();
+            rekisteriCtrl.setRekisteri(rekisteri);
 			primaryStage.show();
+			
 		} catch(Exception e) {
 			e.printStackTrace();
 		}
@@ -29,6 +36,6 @@ public class HiihtorekisteriMain extends Application {
 	 * @param args ei k�yt�ss�
 	 */
 	public static void main(String[] args) {
-		launch(args);
+	    launch(args);
 	}
 }
\ No newline at end of file
diff --git a/src/fxHiihtorekisteri/LisaaHiihtaja.fxml b/src/fxHiihtorekisteri/LisaaHiihtaja.fxml
index 3be2cb4..38693de 100644
--- a/src/fxHiihtorekisteri/LisaaHiihtaja.fxml
+++ b/src/fxHiihtorekisteri/LisaaHiihtaja.fxml
@@ -43,19 +43,19 @@
          </padding>
          <children>
             <Label text="Sukunimi" />
-            <TextField GridPane.columnIndex="1" />
+            <TextField fx:id="kenttaSukunimi" GridPane.columnIndex="1" />
             <Label text="Etunimi" GridPane.rowIndex="1" />
-            <TextField GridPane.columnIndex="1" GridPane.hgrow="ALWAYS" 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 GridPane.columnIndex="1" GridPane.hgrow="ALWAYS" GridPane.rowIndex="3" />
+            <TextField fx:id="kenttaPaikkakunta" GridPane.columnIndex="1" GridPane.hgrow="ALWAYS" GridPane.rowIndex="3" />
             <Label text="Puhelinnumero" GridPane.rowIndex="4" />
-            <TextField GridPane.columnIndex="1" GridPane.rowIndex="4" />
+            <TextField fx:id="kenttaPuh" GridPane.columnIndex="1" GridPane.rowIndex="4" />
             <Label text="Sähköposti" GridPane.rowIndex="5" />
-            <TextField GridPane.columnIndex="1" GridPane.rowIndex="5" />
+            <TextField fx:id="kenttaEmail" GridPane.columnIndex="1" GridPane.rowIndex="5" />
             <Label text="Liittymisvuosi" GridPane.rowIndex="6" />
-            <TextField GridPane.columnIndex="1" GridPane.rowIndex="6" />
-            <DatePicker GridPane.columnIndex="1" GridPane.rowIndex="2" />
+            <TextField fx:id="kenttaLVuosi" GridPane.columnIndex="1" GridPane.rowIndex="6" />
+            <DatePicker fx:id="kenttaSyntymaAika" GridPane.columnIndex="1" GridPane.rowIndex="2" />
          </children>
       </GridPane>
    </center>
diff --git a/src/fxHiihtorekisteri/LisaaHiihtajaGUIController.java b/src/fxHiihtorekisteri/LisaaHiihtajaGUIController.java
index fef6312..680672d 100644
--- a/src/fxHiihtorekisteri/LisaaHiihtajaGUIController.java
+++ b/src/fxHiihtorekisteri/LisaaHiihtajaGUIController.java
@@ -3,10 +3,13 @@ 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;
 
 
 /**
@@ -22,9 +25,39 @@ public class LisaaHiihtajaGUIController implements ModalControllerInterface<Stri
     @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
diff --git a/src/fxHiihtorekisteri/PaaikkunaGUIView.fxml b/src/fxHiihtorekisteri/PaaikkunaGUIView.fxml
index 8336e1e..f240d20 100644
--- a/src/fxHiihtorekisteri/PaaikkunaGUIView.fxml
+++ b/src/fxHiihtorekisteri/PaaikkunaGUIView.fxml
@@ -11,6 +11,7 @@
 <?import javafx.scene.control.MenuItem?>
 <?import javafx.scene.control.ScrollPane?>
 <?import javafx.scene.control.TableColumn?>
+<?import javafx.scene.control.TextArea?>
 <?import javafx.scene.control.TextField?>
 <?import javafx.scene.input.KeyCodeCombination?>
 <?import javafx.scene.layout.BorderPane?>
@@ -67,11 +68,12 @@
                   <VBox alignment="TOP_CENTER" prefHeight="200.0" prefWidth="100.0">
                      <children>
                         <Label contentDisplay="CENTER" text="Hiihtäjät" textAlignment="CENTER" wrapText="true" />
-                        <ListChooser rivit="nimi" />
+                        <ListChooser fx:id="chooserJasenet" rivit="nimi" />
                      </children>
                   </VBox>
                   <VBox alignment="TOP_CENTER">
                      <children>
+                        <TextArea fx:id="textAreaJasen" prefHeight="200.0" prefWidth="200.0" />
                         <Label contentDisplay="CENTER" text="Hiihtäjän tiedot" textAlignment="CENTER" />
                      </children>
                   </VBox>
-- 
GitLab