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