1   package wbKerho;
2   
3   import java.awt.BorderLayout;
4   import java.awt.Color;
5   import java.awt.Component;
6   import java.awt.Dimension;
7   import java.awt.EventQueue;
8   import java.awt.event.ActionEvent;
9   import java.awt.event.ActionListener;
10  import java.awt.event.InputEvent;
11  import java.awt.event.KeyEvent;
12  import java.awt.event.WindowAdapter;
13  import java.awt.event.WindowEvent;
14  
15  import javax.swing.AbstractAction;
16  import javax.swing.Action;
17  import javax.swing.Box;
18  import javax.swing.BoxLayout;
19  import javax.swing.JButton;
20  import javax.swing.JCheckBoxMenuItem;
21  import javax.swing.JFrame;
22  import javax.swing.JLabel;
23  import javax.swing.JMenu;
24  import javax.swing.JMenuBar;
25  import javax.swing.JMenuItem;
26  import javax.swing.JOptionPane;
27  import javax.swing.JPanel;
28  import javax.swing.JScrollPane;
29  import javax.swing.JSplitPane;
30  import javax.swing.JTextField;
31  import javax.swing.KeyStroke;
32  import javax.swing.SwingConstants;
33  import javax.swing.UIManager;
34  import javax.swing.WindowConstants;
35  import javax.swing.border.BevelBorder;
36  import javax.swing.border.EmptyBorder;
37  import javax.swing.border.LineBorder;
38  import javax.swing.table.DefaultTableModel;
39  
40  import kerho.Jasen;
41  import kerhoswing.KerhoSwing;
42  import fi.jyu.mit.gui.ComboBoxChooser;
43  import fi.jyu.mit.gui.EditPanel;
44  import fi.jyu.mit.gui.GenListChooser;
45  import fi.jyu.mit.gui.StringTable;
46  
47  /**
48   * Kerhon käyttöliittymä tehtynä WindowBuilderillä.
49   * Tavoitteena on että varsinainen toiminta on KerhoSwing-luokassa ja
50   * tästä KerhoGUI-luokasta tehdään vaan kutsuja tuonne.  Näin voidaan
51   * ulkoasu muuttaa varsin vapaasti lähes minkälaiseksi vaan.
52   * @author vesal
53   * @version 1.1.2011
54   * @version 30.1.2012 - gui-komponenteilla
55   */
56  public class KerhoGUI extends JFrame {
57      
58      private static final long serialVersionUID = 1L;
59  
60      private String kerhonnimi = "kelmit";
61  
62      private final JPanel contentPane = new JPanel();
63      private final JTextField editHaku = new JTextField();
64      private final JPanel panelLista = new JPanel();
65      private final JPanel panelHaku = new JPanel();
66      private final JLabel labelHakuehto = new JLabel("Hakuehto");
67      private final JPanel panelNappulat = new JPanel();
68      private final JButton buttonUusi = new JButton("Uusi j\u00E4sen");
69      private final JButton buttonTalleta = new JButton("Talleta");
70      private final JPanel panelHarrastukset = new JPanel();
71      private final JMenuBar menuBar = new JMenuBar();
72      private final JMenu mnTiedosto = new JMenu("Tiedosto");
73      private final JMenuItem mntmLopeta = new JMenuItem("Lopeta");
74      private final JMenuItem mntmTalleta = new JMenuItem("Talleta");
75      private final JMenu mnMuokkaa = new JMenu("Muokkaa");
76      private final JMenuItem mntmLisaaUusiJasen = new JMenuItem("Lis\u00E4\u00E4 uusi j\u00E4sen");
77      private final JMenuItem mntmLisaaHarrastus = new JMenuItem("Lis\u00E4\u00E4 harrastus");
78      private final JMenu mnApua = new JMenu("Apua");
79      private final JMenuItem mntmApua = new JMenuItem("Apua");
80      private final JMenuItem mntmTietoja = new JMenuItem("Tietoja...");
81      private final JPanel panelJasen = new JPanel();
82      private final JScrollPane scrollJasen = new JScrollPane(panelJasen);
83      private final Box boxJasen = Box.createVerticalBox();
84      private final JPanel panelJasenTiedot = new JPanel();
85      private final JLabel labelJasenTiedot = new JLabel("J\u00E4sen tiedot");
86      private final JLabel labelHarrastukset = new JLabel("J\u00E4senen harrastukset");
87      private final JPanel panelJasenNappulat = new JPanel();
88      private final JPanel panelHarrastusNappulat = new JPanel();
89      private final JButton buttonUusiHarrastus = new JButton("Uusi harrastus");
90      private final JButton buttonPoistaHarrastus = new JButton("Poista harrastus");
91      private final JLabel labelJasenet = new JLabel("J\u00E4senet");
92      private final JMenuItem mntmPoistaJasen = new JMenuItem("Poista j\u00E4sen...");
93      private final JMenuItem mntmPoistaHarrastus = new JMenuItem("Poista harrastus");
94      private final JSplitPane splitPaneJasenHarrastukset = new JSplitPane();
95      private final JSplitPane splitPaneListaJasentiedot = new JSplitPane();
96      private final JLabel labelVirhe = new JLabel(" ");
97      private final JMenuItem mntmTulosta = new JMenuItem("Tulosta...");
98      private final JMenuItem mntmAvaa = new JMenuItem("Avaa...");
99      private final EditPanel editPanelNimi = new EditPanel();
100     private final EditPanel editPanelHetu = new EditPanel();
101     private final EditPanel editPanelKatuosoite = new EditPanel();
102     private final EditPanel editPanelPostinumero = new EditPanel();
103     private final EditPanel editPanePostiosoite = new EditPanel();
104     private final EditPanel editPanelKotipuhelin = new EditPanel();
105     private final EditPanel editPanelTyopuhelin = new EditPanel();
106     private final EditPanel editPanelAutopuhelin = new EditPanel();
107     private final EditPanel editPanelLiittymisvuosi = new EditPanel();
108     private final EditPanel editPanelJasenmaksu = new EditPanel();
109     private final EditPanel editPanelMaksettumaksu = new EditPanel();
110     private final EditPanel editPanelLisatietoja = new EditPanel();
111     /**
112      * @wbp.nonvisual location=220,561
113      */
114     private final KerhoSwing kerhoswing = new KerhoSwing();
115     private final Action actionUusiJasen = new ActionUusiJasen();
116     private final Action actionTalleta = new ActionTalleta();
117     private final Action actionUusiHarrastus = new ActionUusiHarrastus();
118     private final Action actionPoistaHarrastus = new ActionPoistaHarrastus();
119     private final ComboBoxChooser cbKentat = new ComboBoxChooser();
120     private final StringTable stringTable = new StringTable();
121     private final GenListChooser<Jasen> listJasenet = new GenListChooser<Jasen>();
122     private final JCheckBoxMenuItem mntmUudetDialogilla = new JCheckBoxMenuItem("Uudet dialogilla");
123 
124 
125     /**
126      * @return the kerhoswing
127      */
128     public KerhoSwing getKerhoswing() {
129         return kerhoswing;
130     }
131 
132 
133     /**
134      * Käynnistetään ohjelma
135      * @param args käytettävän kerhon nimi, jos ei ole, niin kysytään.
136      */
137     public static void main(final String[] args) {
138         EventQueue.invokeLater(new Runnable() {
139             @Override
140             public void run() {
141                 try {
142                     UIManager.setLookAndFeel(UIManager
143                             .getSystemLookAndFeelClassName());
144                     KerhoGUI frame = new KerhoGUI();
145                     frame.setVisible(true);
146                     if (args.length == 0) {
147                         if (!frame.avaa())
148                             System.exit(ABORT);
149                     } else
150                         frame.lueTiedosto(args[0]);
151                 } catch (Exception e) {
152                     e.printStackTrace();
153                 }
154             }
155         });
156     }
157 
158 
159     /** 
160      * Create the frame.
161      */
162     public KerhoGUI() {
163         kerhoswing.setTableHarrastukset(stringTable);
164         kerhoswing.setCbKentat(cbKentat);
165         kerhoswing.setListJasenet(listJasenet);
166         addWindowListener(new WindowAdapter() {
167             @Override
168             public void windowClosing(WindowEvent arg0) {
169                 getKerhoswing().talleta();
170             }
171         });
172         kerhoswing.setPanelJasen(boxJasen);
173         kerhoswing.setLabelVirhe(labelVirhe);
174         kerhoswing.setEditHaku(editHaku);
175 
176         setTitle("Kerho");
177         //setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
178         setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
179         setBounds(100, 100, 633, 537);
180         contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
181         contentPane.setLayout(new BorderLayout(0, 0));
182         setContentPane(contentPane);
183 
184         panelNappulat.setBorder(new LineBorder(new Color(0, 0, 0)));
185         contentPane.add(panelNappulat, BorderLayout.SOUTH);
186         panelNappulat.setLayout(new BorderLayout(0, 0));
187 
188         panelNappulat.add(panelJasenNappulat, BorderLayout.WEST);
189         panelNappulat.add(panelHarrastusNappulat, BorderLayout.EAST);
190         buttonUusi.setAction(actionUusiJasen);
191         panelJasenNappulat.add(buttonUusi);
192         buttonUusi.setMnemonic('U');
193         buttonTalleta.setAction(actionTalleta);
194         panelJasenNappulat.add(buttonTalleta);
195         buttonUusiHarrastus.setAction(actionUusiHarrastus);
196 
197         panelHarrastusNappulat.add(buttonUusiHarrastus);
198         buttonPoistaHarrastus.setAction(actionPoistaHarrastus);
199 
200         panelHarrastusNappulat.add(buttonPoistaHarrastus);
201 
202         // panelHarrastusalue.add(panelHarrastus, BorderLayout.SOUTH);
203         contentPane.add(menuBar, BorderLayout.NORTH);
204         mnTiedosto.setMnemonic('T');
205 
206         menuBar.add(mnTiedosto);
207 
208         mntmLopeta.addActionListener(new ActionListener() {
209             @Override
210             public void actionPerformed(ActionEvent arg0) {
211                 lopeta();
212             }
213         });
214         mntmLopeta.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q,
215                 InputEvent.CTRL_MASK));
216 
217         mntmTalleta.setAction(actionTalleta);
218         mntmTalleta.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,
219                 InputEvent.CTRL_MASK));
220         mnTiedosto.add(mntmTalleta);
221 
222         mntmAvaa.addActionListener(new ActionListener() {
223             @Override
224             public void actionPerformed(ActionEvent arg0) {
225                 avaa();
226             }
227         });
228         mnTiedosto.add(mntmAvaa);
229 
230         mntmTulosta.addActionListener(new ActionListener() {
231             @Override
232             public void actionPerformed(ActionEvent arg0) {
233                 tulosta();
234             }
235         });
236         mntmTulosta.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_T,
237                 InputEvent.CTRL_MASK));
238         mnTiedosto.add(mntmTulosta);
239 
240         mnTiedosto.add(mntmLopeta);
241         mnMuokkaa.setMnemonic('M');
242 
243         menuBar.add(mnMuokkaa);
244 
245         mntmLisaaUusiJasen.setAction(actionUusiJasen);
246         mntmLisaaUusiJasen.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N,
247                 InputEvent.CTRL_MASK));
248 
249         mnMuokkaa.add(mntmLisaaUusiJasen);
250         mntmLisaaHarrastus.setAction(actionUusiHarrastus);
251         mntmLisaaHarrastus.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_J,
252                 InputEvent.CTRL_MASK));
253         mnMuokkaa.add(mntmLisaaHarrastus);
254 
255         mntmPoistaJasen.addActionListener(new ActionListener() {
256             @Override
257             public void actionPerformed(ActionEvent arg0) {
258                 getKerhoswing().poistaJasen();
259             }
260         });
261         mnMuokkaa.add(mntmPoistaJasen);
262         mntmPoistaHarrastus.setAction(actionPoistaHarrastus);
263         mnMuokkaa.add(mntmPoistaHarrastus);
264 
265         mntmUudetDialogilla.addActionListener(new ActionListener() {
266             @Override
267             public void actionPerformed(ActionEvent evt) {
268                 getKerhoswing().setUusiDialogilla(((JCheckBoxMenuItem)(evt.getSource())).getState());
269             }
270         });
271         mntmUudetDialogilla.setToolTipText("Kysyt\u00E4\u00E4nk\u00F6 uudet tietueet dialogilla vaiko lis\u00E4t\u00E4\u00E4nk\u00F6 suoraan");
272         mnMuokkaa.add(mntmUudetDialogilla);
273 
274         mnApua.setMnemonic('A');
275         menuBar.add(mnApua);
276         mntmApua.addActionListener(new ActionListener() {
277             @Override
278             public void actionPerformed(ActionEvent arg0) {
279                 getKerhoswing().avustus();
280             }
281         });
282         mnApua.add(mntmApua);
283 
284         mntmTietoja.addActionListener(new ActionListener() {
285             @Override
286             public void actionPerformed(ActionEvent arg0) {
287                 about();
288             }
289 
290         });
291         mnApua.add(mntmTietoja);
292 
293         contentPane.add(splitPaneListaJasentiedot, BorderLayout.CENTER);
294         labelHakuehto.setAlignmentX(Component.CENTER_ALIGNMENT);
295         labelHakuehto.setLabelFor(editHaku);
296         splitPaneListaJasentiedot.setLeftComponent(panelLista);
297         panelLista.setBorder(new BevelBorder(BevelBorder.LOWERED, null, null,
298                 null, null));
299         panelLista.setLayout(new BorderLayout(0, 0));
300         panelHaku.setBorder(new LineBorder(new Color(0, 0, 0)));
301 
302         panelLista.add(panelHaku, BorderLayout.NORTH);
303         panelHaku.setLayout(new BoxLayout(panelHaku, BoxLayout.Y_AXIS));
304         panelHaku.add(labelHakuehto);
305         cbKentat.setSelectedIndex(0);
306         cbKentat.setKohteet(new String[] { "nimi", "hetu", "katuosoite",
307                 "postinumero", "postiosoite" });
308 
309         panelHaku.add(cbKentat);
310         editHaku.setToolTipText("Kirjoita hakuehto yll\u00E4 valitulle kent\u00E4lle");
311 
312         panelHaku.add(editHaku);
313         editHaku.setColumns(10);
314         labelJasenet.setAlignmentX(Component.CENTER_ALIGNMENT);
315         labelJasenet.setHorizontalAlignment(SwingConstants.CENTER);
316 
317         panelHaku.add(labelJasenet);
318         listJasenet.setKohteet(new String[] { "Ankka Aku", "Ankka Iines",
319                 "Ankka Roope", "Ponteva Veli", "Susi Sepe" });
320 
321         panelLista.add(listJasenet, BorderLayout.CENTER);
322         
323         editHaku.requestFocus();
324         splitPaneListaJasentiedot.setRightComponent(splitPaneJasenHarrastukset);
325         splitPaneJasenHarrastukset.setResizeWeight(1.0);
326         splitPaneJasenHarrastukset.setRightComponent(panelHarrastukset);
327         panelHarrastukset.setMaximumSize(new Dimension(200, 32767));
328         panelHarrastukset.setLayout(new BorderLayout(0, 0));
329         panelHarrastukset.add(labelHarrastukset, BorderLayout.NORTH);
330         labelHarrastukset.setHorizontalAlignment(SwingConstants.CENTER);
331         stringTable.getTable().setModel(
332                 new DefaultTableModel(
333             new Object[][] {
334                 {"kalastus", new Integer(1955), new Integer(20)},
335                 {"laiskottelu", new Integer(1950), new Integer(20)},
336                 {"ty\u00F6n pakoilu", new Integer(1952), new Integer(40)},
337             },
338             new String[] {
339                 "ala", "aloitusvuosi", "h/vko"
340             }
341         )); 
342         stringTable.setMinimumSize(new Dimension(200, 24));
343 
344         panelHarrastukset.add(stringTable, BorderLayout.CENTER);
345         splitPaneJasenHarrastukset.setLeftComponent(panelJasenTiedot);
346         panelJasenTiedot.setLayout(new BorderLayout(0, 0));
347         panelJasenTiedot.add(scrollJasen);
348         labelJasenTiedot.setHorizontalAlignment(SwingConstants.CENTER);
349 
350         panelJasenTiedot.add(labelJasenTiedot, BorderLayout.NORTH);
351         labelVirhe.setOpaque(true);
352         labelVirhe.setHorizontalAlignment(SwingConstants.CENTER);
353 
354         panelJasenTiedot.add(labelVirhe, BorderLayout.SOUTH);
355         panelJasen.setBorder(new BevelBorder(BevelBorder.LOWERED, null, null, null, null));
356         panelJasen.setLayout(new BorderLayout(0, 0));
357 
358         panelJasen.add(boxJasen, BorderLayout.NORTH);
359         editPanelNimi.setText("Ankka Aku");
360 
361         boxJasen.add(editPanelNimi);
362         editPanelHetu.setCaption("hetu");
363         editPanelHetu.setText("010245-123U");
364 
365         boxJasen.add(editPanelHetu);
366         editPanelKatuosoite.setCaption("katuosoite");
367         editPanelKatuosoite.setText("Ankkakuja 6");
368 
369         boxJasen.add(editPanelKatuosoite);
370         editPanelPostinumero.setCaption("postinumero");
371         editPanelPostinumero.setText("12345");
372 
373         boxJasen.add(editPanelPostinumero);
374         editPanePostiosoite.setText("ANKKALINNA");
375         editPanePostiosoite.setCaption("postiosoite");
376 
377         boxJasen.add(editPanePostiosoite);
378         editPanelKotipuhelin.setText("12-12324");
379         editPanelKotipuhelin.setCaption("kotipuhelin");
380 
381         boxJasen.add(editPanelKotipuhelin);
382         editPanelTyopuhelin.setText("2");
383         editPanelTyopuhelin.setCaption("ty\u00F6puhelin");
384 
385         boxJasen.add(editPanelTyopuhelin);
386         editPanelAutopuhelin.setCaption("autopuhelin");
387         boxJasen.add(editPanelAutopuhelin);
388         editPanelLiittymisvuosi.setText("1996");
389         editPanelLiittymisvuosi.setCaption("liittymisvuosi");
390         boxJasen.add(editPanelLiittymisvuosi);
391         editPanelJasenmaksu.setText("50.00");
392         editPanelJasenmaksu.setCaption("j\u00E4senmaksu");
393 
394         boxJasen.add(editPanelJasenmaksu);
395         editPanelMaksettumaksu.setText("0.0");
396         editPanelMaksettumaksu.setCaption("maksettu maksu");
397 
398         boxJasen.add(editPanelMaksettumaksu);
399         editPanelLisatietoja.setText("Velkaa Roopelle");
400         editPanelLisatietoja.setCaption("lis\u00E4tietoa");
401 
402         boxJasen.add(editPanelLisatietoja);
403     }
404 
405 
406     /**
407      * Näyttää TiedotDialogin
408      */
409     @SuppressWarnings("unused")
410     protected void about() {
411         new TiedotDialog();
412     }
413 
414 
415     /**
416      * Alustaa kerhon lukemalla sen valitun nimisestä tiedostosta
417      * @param nimi tiedosto josta kerhon tiedot luetaan
418      * @return true jos lukeminen onnistuu
419      */
420     protected boolean lueTiedosto(String nimi) {
421         kerhonnimi = nimi;
422         setTitle("Kerho - " + kerhonnimi);
423         String virhe = kerhoswing.lueTiedosto(nimi);
424         if (virhe == null) return true;
425         
426         JOptionPane.showMessageDialog(null, virhe);
427         return false;
428     }
429 
430 
431     /**
432      * Lähettää lopettamisviestin
433      */
434     protected void lopeta() {
435         processWindowEvent(new WindowEvent(this, WindowEvent.WINDOW_CLOSING));
436     }
437 
438 
439     /**
440      * Tulostaa kerhon tiedot TulostusDialogiin
441      */
442     protected void tulosta() {
443         TulostusDialog dialog = new TulostusDialog();
444         kerhoswing.tulostaValitut(dialog.getTextArea());
445         dialog.setVisible(true);
446     }
447 
448 
449     /**
450      * Tallettaa vanhat tiedot ja kysyy uuden nimen kerholla 
451      * ja avaa tämän tiedoston.
452      * @return false jos nimeä ei anneta
453      */
454     protected boolean avaa() {
455         // kerhoswing.talleta();
456         String uusinimi = KerhonNimiDialog.askName(kerhonnimi);
457         if (uusinimi == null) return false;
458         lueTiedosto(uusinimi);
459         return true;
460     }
461 
462     private class ActionUusiJasen extends AbstractAction {
463         private static final long serialVersionUID = 1L;
464 
465 
466         public ActionUusiJasen() {
467             putValue(NAME, "Uusi jäsen");
468             putValue(SHORT_DESCRIPTION, "Lisää uuden jäsenen kerhoon");
469         }
470 
471 
472         @Override
473         public void actionPerformed(ActionEvent e) {
474             getKerhoswing().uusiJasen();
475         }
476     }
477 
478     private class ActionTalleta extends AbstractAction {
479         private static final long serialVersionUID = 1L;
480 
481 
482         public ActionTalleta() {
483             putValue(NAME, "Talleta");
484             putValue(SHORT_DESCRIPTION, "Tallettaa kerhon tiedot");
485         }
486 
487 
488         @Override
489         public void actionPerformed(ActionEvent e) {
490             getKerhoswing().talleta();
491         }
492 
493     }
494 
495     private class ActionUusiHarrastus extends AbstractAction {
496         private static final long serialVersionUID = 1L;
497 
498 
499         public ActionUusiHarrastus() {
500             putValue(NAME, "Lis\u00E4\u00E4 harrastus");
501             putValue(SHORT_DESCRIPTION,
502                     "Lis\u00E4\u00E4 j\u00E4senelle uuden harrastuksen");
503         }
504 
505 
506         @Override
507         public void actionPerformed(ActionEvent e) {
508             getKerhoswing().uusiHarrastus();
509         }
510     }
511 
512     private class ActionPoistaHarrastus extends AbstractAction {
513         private static final long serialVersionUID = 1L;
514 
515 
516         public ActionPoistaHarrastus() {
517             putValue(NAME, "Poista harrastus");
518             putValue(SHORT_DESCRIPTION, "Poistetaan kohdalla oleva harrastus");
519         }
520 
521 
522         @Override
523         public void actionPerformed(ActionEvent e) {
524             getKerhoswing().poistaHarrastus();
525         }
526     }
527 }
528