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.ImageIcon;
20  import javax.swing.JButton;
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 kerhoswing.KerhoSwing;
41  import fi.jyu.mit.gui.ComboBoxChooser;
42  import fi.jyu.mit.gui.EditPanel;
43  import fi.jyu.mit.gui.ListChooser;
44  import fi.jyu.mit.gui.StringTable;
45  
46  /**
47   * Kerhon käyttöliittymä tehtynä WindowBuilderillä.
48   * Tavoitteena on että varsinainen toiminta on KerhoSwing-luokassa ja
49   * tästä KehoGUI-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-komponnteilla
54   */
55  public class KerhoGUI extends JFrame {
56  
57      private static final long serialVersionUID = 1L;
58  
59      private String kerhonnimi = "kelmit";
60  
61      private JPanel contentPane = new JPanel();
62      private JTextField editHaku = new JTextField();
63      private JPanel panelLista = new JPanel();
64      private JPanel panelHaku = new JPanel();
65      private JLabel labelHakuehto = new JLabel("Hakuehto");
66      private JPanel panelNappulat = new JPanel();
67      private JButton buttonUusi = new JButton("Uusi j\u00E4sen");
68      private 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     protected 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 ListChooser listJasenet = new ListChooser();
119     private final ComboBoxChooser cbKentat = new ComboBoxChooser();
120     private final StringTable stringTable = new StringTable();
121     
122 
123     /**
124      * Launch the application.
125      * @param args käytettävän kerhon nimi, jos ei ole, niin kysytään.
126      */
127     public static void main(final String[] args) {
128         EventQueue.invokeLater(new Runnable() {
129             @Override
130             public void run() {
131                 try {
132                     UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
133                     KerhoGUI frame = new KerhoGUI();
134                     frame.setVisible(true);
135                     if ( args.length == 0 ) {
136                         if ( !frame.avaa() ) System.exit(ABORT);
137                     } else
138                         frame.lueTiedosto(args[0]);
139                 } catch (Exception e) {
140                     e.printStackTrace();
141                 }
142             }
143         });
144     }
145 
146     
147     /** 
148      * Create the frame.
149      */
150     public KerhoGUI() {
151         kerhoswing.setTableHarrastukset(stringTable);
152         kerhoswing.setCbKentat(cbKentat);
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         
173         panelNappulat.setBorder(new LineBorder(new Color(0, 0, 0)));
174         contentPane.add(panelNappulat, BorderLayout.SOUTH);
175         panelNappulat.setLayout(new BorderLayout(0, 0));
176         
177         panelNappulat.add(panelJasenNappulat, BorderLayout.WEST);
178         panelNappulat.add(panelHarrastusNappulat, BorderLayout.EAST);
179         buttonUusi.setAction(actionUusiJasen);
180         panelJasenNappulat.add(buttonUusi);
181         buttonUusi.setMnemonic('U');
182         buttonTalleta.setAction(actionTalleta);
183         panelJasenNappulat.add(buttonTalleta);
184         buttonUusiHarrastus.setIcon(new ImageIcon(KerhoGUI.class.getResource("/com/sun/java/swing/plaf/windows/icons/NewFolder.gif")));
185         buttonUusiHarrastus.setAction(actionUusiHarrastus);
186         
187         panelHarrastusNappulat.add(buttonUusiHarrastus);
188         buttonPoistaHarrastus.setAction(actionPoistaHarrastus);
189         
190         panelHarrastusNappulat.add(buttonPoistaHarrastus);
191         
192         // panelHarrastusalue.add(panelHarrastus, BorderLayout.SOUTH);
193         contentPane.add(menuBar, BorderLayout.NORTH);
194         mnTiedosto.setMnemonic('T');
195         
196         menuBar.add(mnTiedosto);
197         mntmLopeta.addActionListener(new ActionListener() {
198             @Override
199             public void actionPerformed(ActionEvent arg0) {
200                 lopeta();
201             }
202         });
203         mntmLopeta.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q, InputEvent.CTRL_MASK));
204         mntmTalleta.setAction(actionTalleta);
205         mntmTalleta.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_MASK));
206         mnTiedosto.add(mntmTalleta);
207         mntmAvaa.addActionListener(new ActionListener() {
208             @Override
209             public void actionPerformed(ActionEvent arg0) {
210                 avaa();
211             }
212         });
213         
214         mnTiedosto.add(mntmAvaa);
215         mntmTulosta.addActionListener(new ActionListener() {
216             @Override
217             public void actionPerformed(ActionEvent arg0) {
218                 tulosta();
219             }
220         });
221         mntmTulosta.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_T, InputEvent.CTRL_MASK));
222         
223         mnTiedosto.add(mntmTulosta);
224         
225         mnTiedosto.add(mntmLopeta);
226         mnMuokkaa.setMnemonic('M');
227         
228         menuBar.add(mnMuokkaa);
229         mntmLisaaUusiJasen.setAction(actionUusiJasen);
230         mntmLisaaUusiJasen.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, InputEvent.CTRL_MASK));
231         
232         mnMuokkaa.add(mntmLisaaUusiJasen);
233         mntmLisaaHarrastus.setAction(actionUusiHarrastus);
234         mntmLisaaHarrastus.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_J, InputEvent.CTRL_MASK));
235         
236         mnMuokkaa.add(mntmLisaaHarrastus);
237         mntmPoistaJasen.addActionListener(new ActionListener() {
238             @Override
239             public void actionPerformed(ActionEvent arg0) {
240                 kerhoswing.poistaJasen();
241             }
242         });
243         
244         mnMuokkaa.add(mntmPoistaJasen);
245         mntmPoistaHarrastus.setAction(actionPoistaHarrastus);
246         
247         mnMuokkaa.add(mntmPoistaHarrastus);
248         mnApua.setMnemonic('A');
249         menuBar.add(mnApua);
250         mntmApua.addActionListener(new ActionListener() {
251             @Override
252             public void actionPerformed(ActionEvent arg0) {
253                 kerhoswing.avustus();
254             }
255         });
256         
257         mnApua.add(mntmApua);
258         mntmTietoja.addActionListener(new ActionListener() {
259             @Override
260             public void actionPerformed(ActionEvent arg0) {
261                 about();
262             }
263 
264         });
265         
266         mnApua.add(mntmTietoja);
267         
268         contentPane.add(splitPaneListaJasentiedot, BorderLayout.CENTER);
269         labelHakuehto.setAlignmentX(Component.CENTER_ALIGNMENT);
270         labelHakuehto.setLabelFor(editHaku);
271         splitPaneListaJasentiedot.setLeftComponent(panelLista);
272         panelLista.setBorder(new BevelBorder(BevelBorder.LOWERED, null, null, null, null));
273         panelLista.setLayout(new BorderLayout(0, 0));
274         panelHaku.setBorder(new LineBorder(new Color(0, 0, 0)));
275         
276         panelLista.add(panelHaku, BorderLayout.NORTH);
277         panelHaku.setLayout(new BoxLayout(panelHaku, BoxLayout.Y_AXIS));
278         panelHaku.add(labelHakuehto);
279         cbKentat.setSelectedIndex(0);
280         cbKentat.setKohteet(new String[] {"nimi", "hetu", "katuosoite", "postinumero", "postiosoite"});
281         
282         panelHaku.add(cbKentat);
283         editHaku.setToolTipText("Kirjoita hakuehto yll\u00E4 valitulle kent\u00E4lle");
284         
285         
286         panelHaku.add(editHaku);
287         editHaku.setColumns(10);
288         labelJasenet.setAlignmentX(Component.CENTER_ALIGNMENT);
289         labelJasenet.setHorizontalAlignment(SwingConstants.CENTER);
290         
291         panelHaku.add(labelJasenet);
292         listJasenet.setKohteet(new String[] {"Ankka Aku", "Ankka Iines", "Ankka Roope", "Ponteva Veli", "Susi Sepe"});
293         
294         panelLista.add(listJasenet, BorderLayout.CENTER);
295         
296         editHaku.requestFocus();
297         splitPaneListaJasentiedot.setRightComponent(splitPaneJasenHarrastukset);
298         splitPaneJasenHarrastukset.setResizeWeight(1.0);
299         splitPaneJasenHarrastukset.setRightComponent(panelHarrastukset);
300         panelHarrastukset.setMaximumSize(new Dimension(200, 32767));
301         panelHarrastukset.setLayout(new BorderLayout(0, 0));
302         panelHarrastukset.add(labelHarrastukset, BorderLayout.NORTH);
303         labelHarrastukset.setHorizontalAlignment(SwingConstants.CENTER);
304         stringTable.getTable().setModel(new DefaultTableModel(
305             new Object[][] {
306                 {"kalastus", new Integer(1955), new Integer(20)},
307                 {"laiskottelu", new Integer(1950), new Integer(20)},
308                 {"ty\u00F6n pakoilu", new Integer(1952), new Integer(40)},
309             },
310             new String[] {
311                 "ala", "aloitusvuosi", "h/vko"
312             }
313         ));
314         stringTable.setMinimumSize(new Dimension(200, 24));
315 
316         
317         panelHarrastukset.add(stringTable, BorderLayout.CENTER);
318         splitPaneJasenHarrastukset.setLeftComponent(panelJasenTiedot);
319         panelJasenTiedot.setLayout(new BorderLayout(0, 0));
320         panelJasenTiedot.add(scrollJasen);
321         labelJasenTiedot.setHorizontalAlignment(SwingConstants.CENTER);
322         
323         panelJasenTiedot.add(labelJasenTiedot, BorderLayout.NORTH);
324         labelVirhe.setOpaque(true);
325         labelVirhe.setHorizontalAlignment(SwingConstants.CENTER);
326         
327         panelJasenTiedot.add(labelVirhe, BorderLayout.SOUTH);
328         panelJasen.setBorder(new BevelBorder(BevelBorder.LOWERED, null, null, null, null));
329         panelJasen.setLayout(new BorderLayout(0, 0));
330         
331         panelJasen.add(boxJasen, BorderLayout.NORTH);
332         editPanelNimi.setText("Ankka Aku");
333         
334         boxJasen.add(editPanelNimi);
335         editPanelHetu.setCaption("hetu");
336         editPanelHetu.setText("010245-123U");
337         
338         boxJasen.add(editPanelHetu);
339         editPanelKatuosoite.setCaption("katuosoite");
340         editPanelKatuosoite.setText("Ankkakuja 6");
341         
342         boxJasen.add(editPanelKatuosoite);
343         editPanelPostinumero.setCaption("postinumero");
344         editPanelPostinumero.setText("12345");
345         
346         boxJasen.add(editPanelPostinumero);
347         editPanePostiosoite.setText("ANKKALINNA");
348         editPanePostiosoite.setCaption("postiosoite");
349         
350         boxJasen.add(editPanePostiosoite);
351         editPanelKotipuhelin.setText("12-12324");
352         editPanelKotipuhelin.setCaption("kotipuhelin");
353         
354         boxJasen.add(editPanelKotipuhelin);
355         editPanelTyopuhelin.setText("2");
356         editPanelTyopuhelin.setCaption("ty\u00F6puhelin");
357         
358         boxJasen.add(editPanelTyopuhelin);
359         editPanelAutopuhelin.setCaption("autopuhelin");
360         boxJasen.add(editPanelAutopuhelin);
361         editPanelLiittymisvuosi.setText("1996");
362         editPanelLiittymisvuosi.setCaption("liittymisvuosi");
363         boxJasen.add(editPanelLiittymisvuosi);
364         editPanelJasenmaksu.setText("50.00");
365         editPanelJasenmaksu.setCaption("j\u00E4senmaksu");
366         
367         boxJasen.add(editPanelJasenmaksu);
368         editPanelMaksettumaksu.setText("0.0");
369         editPanelMaksettumaksu.setCaption("maksettu maksu");
370         
371         boxJasen.add(editPanelMaksettumaksu);
372         editPanelLisatietoja.setText("Velkaa Roopelle");
373         editPanelLisatietoja.setCaption("lis\u00E4tietoa");
374         
375         boxJasen.add(editPanelLisatietoja);
376     }
377 
378 
379     /**
380      * Näyttää TiedotDialogin
381      */
382     protected void about() {
383         new TiedotDialog();
384     }
385 
386     
387     /**
388      * Alustaa kerhon lukemalla sen valitun nimisestä tiedostosta
389      * @param nimi tiedosto josta kerhon tiedot luetaan
390      */
391     protected void lueTiedosto(String nimi) {
392         kerhonnimi = nimi;
393         setTitle("Kerho - " + kerhonnimi);
394         String virhe = kerhoswing.lueTiedosto(nimi);
395         if ( virhe != null ) JOptionPane.showMessageDialog(null, virhe);
396     }
397 
398 
399     /**
400      * Lähettää lopettamisviestin
401      */
402     protected void lopeta() {
403         processWindowEvent(new WindowEvent(this, WindowEvent.WINDOW_CLOSING));    
404     }
405 
406     
407     /**
408      * Tulostaa kerhon tiedot TulostusDialogiin
409      */
410     protected void tulosta() {
411         TulostusDialog dialog = new TulostusDialog();
412         kerhoswing.tulostaValitut(dialog.getTextArea()); 
413         dialog.setVisible(true);
414     }
415 
416     
417     /**
418      * Tallettaa vanhat tiedot ja kysyy uuden nimen kerholla 
419      * ja avaa tämän tiedoston.
420      * @return false jos nimeä ei anneta
421      */
422     protected boolean avaa() {
423         // kerhoswing.talleta();
424         String uusinimi = KerhonNimiDialog.askName(kerhonnimi);
425         if ( uusinimi == null ) return false;
426         lueTiedosto(uusinimi);
427         return true;
428 
429     }
430     
431     
432     
433     private class ActionUusiJasen extends AbstractAction {
434         private static final long serialVersionUID = 1L;
435         public ActionUusiJasen() {
436             putValue(NAME, "Uusi jäsen");
437             putValue(SHORT_DESCRIPTION, "Lisää uuden jäsenen kerhoon");
438         }
439         @Override
440         public void actionPerformed(ActionEvent e) {
441             kerhoswing.uusiJasen();
442         }
443     }
444     
445     private class ActionTalleta extends AbstractAction {
446         private static final long serialVersionUID = 1L;
447         public ActionTalleta() {
448             putValue(NAME, "Talleta");
449             putValue(SHORT_DESCRIPTION, "Tallettaa kerhon tiedot");
450         }
451         @Override
452         public void actionPerformed(ActionEvent e) {
453             kerhoswing.talleta();
454         }
455         
456     }
457 
458     private class ActionUusiHarrastus extends AbstractAction {
459         private static final long serialVersionUID = 1L;
460         public ActionUusiHarrastus() {
461             putValue(NAME, "Lis\u00E4\u00E4 harrastus");
462             putValue(SHORT_DESCRIPTION, "Lis\u00E4\u00E4 j\u00E4senelle uuden harrastuksen");
463         }
464         @Override
465         public void actionPerformed(ActionEvent e) {
466             kerhoswing.uusiHarrastus();
467         }
468     }
469     
470     private class ActionPoistaHarrastus extends AbstractAction {
471         private static final long serialVersionUID = 1L;
472         public ActionPoistaHarrastus() {
473             putValue(NAME, "Poista harrastus");
474             putValue(SHORT_DESCRIPTION, "Poistetaan kohdalla oleva harrastus");
475         }
476         @Override
477         public void actionPerformed(ActionEvent e) {
478             kerhoswing.poistaHarrastus();
479         }
480     }
481 }
482 
483 
484 
485