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