/** * */ package kerhoswing; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextField; import javax.swing.UIManager; import javax.swing.border.EmptyBorder; import kanta.IntKentta; import kanta.JonoKentta; import kanta.Kentta; import kanta.PohjaTietue; import kanta.RegExpTarkistaja; import kanta.Tietue; import kerho.Harrastus; import kerho.Jasen; import fi.jyu.mit.gui.EditPanel; /** * Dialogi, jolla voidaan muokata Tietue-rajapinnan edustajaa * @author vesal * @version 25.03.2012 * TODO muuta paneeliksi jota voi käyttää toisissa formeissa. */ public class TietueDialog extends JDialog { private static final long serialVersionUID = 1L; private static Color virheVari = new Color(255, 0, 0); private static Color normaaliVari = new Color(255, 255, 255); private boolean result = false; private Tietue muokattavaTietue; private int editLeveys = 150; private int maxLabelLeveys = 20; private EditPanel[] editTietueKentta = null; private final JPanel contentPanel = new JPanel(); private JPanel buttonPane = new JPanel(); private JButton okButton = new JButton("OK"); private JButton cancelButton = new JButton("Cancel"); private final JLabel labelVirhe = new JLabel(""); private final JScrollPane scrollTietue = new JScrollPane(); private final JPanel panelTietueenPaikka = new JPanel(); /** * Testiohjelman tietueen kysymisdialogille * @param args ei käytössä */ public static void main(String[] args) { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (Throwable e) { e.printStackTrace(); } try { boolean result; Jasen jasen = new Jasen(); Harrastus har = new Harrastus(); result = kysyTietue(jasen,"Anna jäsenen tiedot",200); if ( !result ) return; result = kysyTietue(har,"Anna harrastuksen tiedot",50); if ( !result ) JOptionPane.showMessageDialog(null, "Et tykännyt"); Kentta[] kentat = { new IntKentta("id"), new JonoKentta("Laita merkkejä A-F",new RegExpTarkistaja("[A-F]+")), new JonoKentta("Laita haluttu määrä a",new RegExpTarkistaja("a+","Vain a kirjaimia")) }; PohjaTietue t = new PohjaTietue(kentat, 1); result = kysyTietue(t,"Anna lisätiedot",40); if ( !result ) return; JOptionPane.showMessageDialog(null, "Ekaan laitoit: " + t.anna(1)); } catch (Exception e) { e.printStackTrace(); } } /** * Käynnistä dialogi ja kysy tietueeseen tiedot * @param tietue tietue jota muoskataan * @param otsikko lomakkeessa näytettävä otsikko * @param editLeveys kuinka leveäski edit-lenttä tehdään * @return true jos kuitattu OK, muuten false */ public static boolean kysyTietue(Tietue tietue,String otsikko, int editLeveys) { boolean ret = false; TietueDialog dialog = new TietueDialog(); dialog.setTitle(otsikko); dialog.setEditLeveys(editLeveys); dialog.setMuokattavaTietue(tietue); dialog.setVisible(true); ret = dialog.getResult(); dialog.dispose(); return ret; } /** * Create the dialog. */ public TietueDialog() { setModalityType(ModalityType.APPLICATION_MODAL); setModal(true); setBounds(100, 100, 367, 411); getContentPane().setLayout(new BorderLayout()); contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5)); getContentPane().add(contentPanel, BorderLayout.CENTER); contentPanel.setLayout(new BorderLayout(0, 0)); labelVirhe.setOpaque(true); labelVirhe.setPreferredSize(new Dimension(20, 20)); contentPanel.add(labelVirhe, BorderLayout.SOUTH); contentPanel.add(scrollTietue, BorderLayout.CENTER); scrollTietue.setViewportView(panelTietueenPaikka); panelTietueenPaikka.setLayout(new BorderLayout(0, 0)); panelTietueenPaikka.add(panelTietue, BorderLayout.NORTH); panelTietue.setLayout(new BoxLayout(panelTietue, BoxLayout.Y_AXIS)); panelTietue.add(editPanelNimi); editPanelHetu.setCaption("hetu"); panelTietue.add(editPanelHetu); buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT)); getContentPane().add(buttonPane, BorderLayout.SOUTH); okButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (!tarkista() ) return; setResult(true); setVisible(false); } }); okButton.setActionCommand("OK"); buttonPane.add(okButton); getRootPane().setDefaultButton(okButton); cancelButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { setVisible(false); } }); cancelButton.setActionCommand("Cancel"); buttonPane.add(cancelButton); } /** * Palautetaan dialogista saatu tulos. * @return true jos painettiuin ok, muuten false */ public boolean getResult() { return result; } /** * Apumetodi tuloksen asettamiseksi sisäistä luokista * @param value palautettava arvo */ protected void setResult(Boolean value) { result = value; } /** * @return mitä tietuetta ollaan muokkaamassa */ protected Tietue getMuokattavaTietue() { return muokattavaTietue; } /** * Käsittelijäluokka edit kentän näppäimen vapauttamiselle */ protected class EditKeyReleased extends KeyAdapter { @Override public void keyReleased(KeyEvent e) { kasitteleMuutosTietueeseen((JTextField)e.getComponent()); } } private EditKeyReleased editKeyReleased = new EditKeyReleased(); private final JPanel panelTietue = new JPanel(); private final EditPanel editPanelNimi = new EditPanel(); private final EditPanel editPanelHetu = new EditPanel(); /** * @param tietue tietue jota muokataan */ protected void setMuokattavaTietue(Tietue tietue) { this.muokattavaTietue = tietue; panelTietue.removeAll(); int n = tietue.getKenttia() - tietue.ekaKentta(); editTietueKentta = new EditPanel[n]; maxLabelLeveys = 20; for (int i = 0, k = tietue.ekaKentta(); k < tietue.getKenttia(); k++, i++) { EditPanel edit = new EditPanel(); edit.setCaption(tietue.getKysymys(k)); edit.setText(tietue.anna(k)); editTietueKentta[i] = edit; edit.setName("et" + k); edit.getEdit().setName("tt" + k); panelTietue.add(edit); edit.addKeyListener(editKeyReleased); edit.setLabelWidth(150); Font font = edit.getLabel().getFont(); // int fontHeight = getFontMetrics(font).getHeight(); int w = getFontMetrics(font).stringWidth(edit.getCaption()) + 10; if ( w > maxLabelLeveys ) maxLabelLeveys = w; } asetaLeveydet(); } /** * Asetetaan edit-kenttien leveydet maksimin ja edit-leveyden mukaan */ protected void asetaLeveydet() { if ( editTietueKentta == null ) return; for (EditPanel edit : editTietueKentta) { int h = edit.getPreferredSize().height; edit.setLabelWidth(maxLabelLeveys); edit.setPreferredSize(new Dimension(editLeveys+maxLabelLeveys,h)); } pack(); // muokkaa dialogin mahdollisimman pieneksi } /** * Laitetaan virheilmoitus näkyville jos labelVirhe on alustettu. * Miksä virhettä ei ole, niin piilotetaan virheilmoitus. * @param virhe virheteksti */ protected void setVirhe(String virhe) { if ( labelVirhe == null ) return; if ( virhe == null ) { labelVirhe.setText(""); labelVirhe.setVisible(false); okButton.setVisible(true); return; } labelVirhe.setVisible(true); labelVirhe.setText(" " +virhe); labelVirhe.setBackground(virheVari); okButton.setVisible(false); } private boolean ekaKerta = false; // laita tähän true jos tulee aluksi turha tapahtuma /** * Käsittelee edit-kenttään tulleen muutoksen tietueeseen. * Jos muutosta ei voida sijoittaa tietueeseen, muutetaan * taustaväri punaiseksi. * @param edit muuttunut kenttä */ protected void kasitteleMuutosTietueeseen(JTextField edit) { if (ekaKerta) { ekaKerta = false; return; } // Jostakin syystä yksi tapahtuma tulee heti aluksi. Tätä ei haluta if (editTietueKentta == null) return; if (edit == null) return; if (muokattavaTietue == null) return; String s = edit.getText(); int k = Integer.parseInt(edit.getName().substring(2)); String virhe = muokattavaTietue.aseta(k, s); setVirhe(virhe); if (virhe == null) { edit.setToolTipText(""); edit.setBackground(normaaliVari); } else { edit.setToolTipText(virhe); edit.setBackground(virheVari); } } /** * Tarkistetaan onko kaikki kentät täytetty oikein * @return true jos kentät oikein */ protected boolean tarkista() { boolean res = true; ekaKerta = false; JTextField ekaVirhe = null; for (EditPanel edit : editTietueKentta) { kasitteleMuutosTietueeseen(edit.getEdit()); if ( !okButton.isValid() ) { if ( ekaVirhe == null ) ekaVirhe = edit.getEdit(); res = false; } } if ( ekaVirhe != null ) { kasitteleMuutosTietueeseen(ekaVirhe); ekaVirhe.requestFocusInWindow(); } return res; } /** * @return editointikentän leveys */ public int getEditLeveys() { return editLeveys; } /** * @param editLeveys leveys editointikentille */ public void setEditLeveys(int editLeveys) { this.editLeveys = editLeveys; // asetaLeveydet(); if ( muokattavaTietue != null ) setMuokattavaTietue(muokattavaTietue); } }