import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
/**
* Luokka on tarkoitettu kurssien tietojen muokkaamiseen
* ja uuden kurssin luomiseen graafisella käyttöliittymällä.
* @author Mikko
*
*/
public class KurssiDialog extends JDialog {
private static final long serialVersionUID = 1L;
/*
* Dialogilla on tieto, mitä kurssia muokataan
* vai ollaanko luomassa uutta kurssia (kurssi==null).
*/
private Kurssi kurssi;
/*
* Näiden kenttien arvoja pääsee käyttäjä muokkaamaan
* käyttöliittymässä.
*/
private JComboBox koulutusohjelmaLista = null;
private JTextField kurssinNimi = new JTextField();
private JTextField kurssinKoodi = new JTextField();
private JTextField kurssinPisteet = new JTextField();
private JTextField kurssinKesto = new JTextField();
private JTextField kurssinPeriodit = new JTextField();
private JTextField kurssinEsitiedot = new JTextField();
private JTextArea kurssinKuvaus = new JTextArea(5,20);
/**
* Konstruktosi luo uuden JDialog-ikkunan, jossa käyttäjä
* voi muokata kurssin tietoja tai luoda uuden kurssin riippuen
* siitä, mikä on parametrin kurssi-arvo. Jos kurssi on mikä tahansa
* olemassa oleva kurssi, muokataan kyseistä kurssia. Jos kurssi on
* null, luodaan uusi kurssi.
* @param omistaja Tämän ikkunan omistaja
* @param modaalinen Onko ikkuna modaalinen
* @param kurssi Muokattava kurssi tai null, jos luodaan
* uusi kurssi.
* @see Kurssi
*/
public KurssiDialog (JFrame omistaja, boolean modaalinen, Kurssi kurssi) {
super (omistaja, modaalinen);
this.kurssi = kurssi;
/*
* Määrätään ikkunalle asettelija
*/
BorderLayout layout = new BorderLayout();
this.getContentPane().setLayout(layout);
/*
* Luodaan muutama paneeli ja asetetaan niille asettelijat
*/
JPanel keski = new JPanel();
JPanel keski2 = new JPanel();
JPanel ala = new JPanel();
keski.setLayout(new BorderLayout());
keski2.setLayout(new GridLayout(0,1));
ala.setLayout(new FlowLayout());
/*
* Luodaan yhdistelmäruutu, joka saa arvokseen kaikki olemassa
* olevat koulutusohjelmat.
*/
this.koulutusohjelmaLista = new JComboBox(Koulutusohjelma.listaaOhjelmat());
/*
* Lisätään yhdeistelmäruutu sekä äsken luodut paneelit
* ikkunaan.
*/
this.getContentPane().add(this.koulutusohjelmaLista, BorderLayout.NORTH);
this.getContentPane().add(keski, BorderLayout.CENTER);
this.getContentPane().add(ala, BorderLayout.SOUTH);
/*
* Luodaan painikkeet, joilla voi hyväksyä kurssin muutokset
* tai poistaa kurssi.
*/
JButton teeMuutokset = new JButton("Tee muutokset");
JButton poistaKurssi = new JButton("Poista kurssi");
/*
* Lisätään painikkeet ala-paneeliin
*/
ala.add(teeMuutokset);
ala.add(poistaKurssi);
/*
* Lisätään paneeli keski-paneeliin ja lisätään
* keski2-paneeliin kentät kurssin tietojen muokkausta
* varten.
*/
keski.add(keski2, BorderLayout.NORTH);
keski2.add(this.kurssinNimi);
keski2.add(this.kurssinKoodi);
keski2.add(this.kurssinPisteet);
keski2.add(this.kurssinPeriodit);
keski2.add(this.kurssinKesto);
keski2.add(this.kurssinEsitiedot);
/*
* Asetetaan kentille vihjetekstit
*/
this.kurssinNimi.setToolTipText("Kurssin nimi");
this.kurssinKoodi.setToolTipText("Kurssin kurssikoodi");
this.kurssinPisteet.setToolTipText("Kurssin opintopisteet");
this.kurssinKesto.setToolTipText("Kurssin kesto periodeina");
this.kurssinPeriodit.setToolTipText("Periodit, jolloin kurssi järjestetään pilkuilla eroteltuna.");
this.kurssinEsitiedot.setToolTipText("Kurssin esitietokurssien kurssikoodit pilkuilla eroteltuna.");
this.kurssinKuvaus.setToolTipText("Lyhyehkö kuvaus kurssin aihesisällöstä");
/*
* Luodaan vierityspaneeli kurssin kuvausta varten ja lisätään
* se keski-paneeliin. Lisätään vierityspaneeliin kurssin
* kuvauksen tekstikenttä, jolle asetetaan vielä tekstin rivitys.
*/
JScrollPane kurssinKuvausVieritys = new JScrollPane();
keski.add(kurssinKuvausVieritys, BorderLayout.CENTER);
kurssinKuvausVieritys.getViewport().add(this.kurssinKuvaus);
this.kurssinKuvaus.setLineWrap(true);
this.kurssinKuvaus.setWrapStyleWord(true);
/*
* Jos ollaan luomassa uutta kurssia (kurssi==null),
* asetetaan kenttien nimiksi ohjeet, mitä niihin pitää kirjoittaa.
* Jos taas ollaan muokkaamassa kurssia, haetaan kenttiin
* kurssin senhetkiset arvot.
*/
if (this.kurssi==null) {
this.kurssinNimi.setText("Kurssin nimi");
this.kurssinKoodi.setText("Kurssikoodi");
this.kurssinPisteet.setText("Opintopisteet");
this.kurssinKesto.setText("Kesto periodeina");
this.kurssinPeriodit.setText("Järjestetään periodeilla");
this.kurssinEsitiedot.setText("Esitietokurssit");
this.kurssinKuvaus.setText("Kurssin kuvaus");
poistaKurssi.setEnabled(false); // Kurssia ei voi poistaa, kun sitä luodaan
this.setTitle("Luo uusi kurssi");
} else {
this.kurssinNimi.setText(kurssi.kerroNimi());
this.kurssinKoodi.setText(kurssi.kerroKurssikoodi());
// Jos muokataan kurssia, ei kurssikoodia voi muokata
this.kurssinKoodi.setEditable(false);
this.kurssinPisteet.setText(""+kurssi.kerroOpintopisteet());
this.kurssinKesto.setText(""+kurssi.kerroKesto());
this.kurssinPeriodit.setText(kurssi.kerroPerioditTekstina());
this.kurssinEsitiedot.setText(kurssi.kerroEsitiedotTekstina());
this.kurssinKuvaus.setText(kurssi.kerroKuvaus());
this.koulutusohjelmaLista.setSelectedItem(Koulutusohjelma.koulutusohjelmat.get(kurssi.kerroKurssikoodi().split("-")[0]));
// Jos muokataan kurssia, ei koulutusohjelmaa voi uudelleenvalita
this.koulutusohjelmaLista.setEnabled(false);
// Jos kurssi on jo poistettu, ei sitä voi enää poistaa uudelleen
if (this.kurssi.onPoistettu()==true)
poistaKurssi.setEnabled(false);
this.setTitle("Muokkaa kurssia");
}
/*
* Asetetaan tapahtumankuuntelijat painikkeille.
*/
teeMuutokset.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
muokkaaKurssia();
}
});
poistaKurssi.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
poistaKurssi();
}
});
}
/**
* Poistaa kurssin, jota ollaan muokkaamassa. Varmistaa ensin,
* että onko käyttäjä varma, haluaako hän poistaa kurssin.
* Jos vastataan kyllä, poistetaan kurssi kutsumalla
* kurssin poistaKurssi-metodia ja kerrotaan kurssin poiston
* onnistuneen.
* @see Kurssi#poistaKurssi()
*/
private void poistaKurssi() {
int vastaus = JOptionPane.showConfirmDialog(this, "Haluatko varmasti poistaa kurssin", "Kurssin poistaminen", JOptionPane.YES_NO_OPTION);
if (vastaus==JOptionPane.YES_OPTION) {
kurssi.poistaKurssi();
JOptionPane.showMessageDialog(this, "Kurssin poisto onnistui", "Kurssin poistaminen", JOptionPane.INFORMATION_MESSAGE);
this.setVisible(false);
}
}
/**
* Muokkaa kurssia, joka on annettu konstruktorin parametrina.
* Jos parametri on ollut null, ollaan luomassa uutta kurssia.
* @see Kurssi#muokkaaKurssia(String, int, boolean[], String[], int, String)
* @see Koulutusohjelma#lisaaKurssi(String, String, int, boolean[], int, String)
*/
private void muokkaaKurssia() {
/*
* Etsitään kurssi, jolla on kurssiKoodi-kentän sisältämä
* kurssikoodi. Jos ollaan muokkaamassa kurssia, ei tämän kentän
* arvoa voi käyttäjä muuttaa.
*/
Kurssi kurssi = Koulutusohjelma.etsiKurssi(this.kurssinKoodi.getText());
/*
* Luetaan kenttien arvot ja tallennetaan ne muuttujiin.
* Samalla otetaan turhat välilyönnit pois alusta ja lopusta.
* Kenttien arvoja luettaessa voi tulla Numberformatexception, jos
* numeerisiksi arvoiksi on annettu kirjaimia.
*/
try {
String kurssikoodi = this.kurssinKoodi.getText().trim();
String nimi = this.kurssinNimi.getText().trim();
int opintopisteet = Integer.parseInt(this.kurssinPisteet.getText().trim());
int kesto = Integer.parseInt(this.kurssinKesto.getText().trim());
String kuvaus = this.kurssinKuvaus.getText().trim();
/*
* Luetaan periodit, jolloin kurssi järjestetään.
* Jos yhtään periodia ei ole kirjoitettu, kaikkien
* arvoksi tulee false. Muutoin pätkitään kirjoitetut
* periodit pilkun kohdalta osiin ja laitetaan sen periodin
* arvoksi true, joka luetaan osituksesta.
*/
boolean[] periodit = {false, false, false, false};
String ositus[] = this.kurssinPeriodit.getText().split(",");
int periodi = 0;
for (int i=0; i=1 && periodi<=4)
periodit[periodi-1] = true;
else
throw new NumberFormatException();
}
/*
* Ositetaan kurssin esitiedot pilkun kohdalta osiin ja
* luetaan kaikki kurssikoodit esitiedot-taulukkoon.
*/
String ositus2[] = this.kurssinEsitiedot.getText().split(",");
String[] esitiedot = new String[ositus2.length];
for (int i=0; i