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