1   package kerhoswing;
2   
3   import java.awt.Color;
4   import java.awt.Desktop;
5   import java.awt.event.KeyAdapter;
6   import java.awt.event.KeyEvent;
7   import java.io.IOException;
8   import java.io.PrintStream;
9   import java.net.URI;
10  import java.net.URISyntaxException;
11  
12  import javax.swing.JComponent;
13  import javax.swing.JLabel;
14  import javax.swing.JOptionPane;
15  import javax.swing.JTextArea;
16  import javax.swing.JTextField;
17  
18  import kerho.Jasen;
19  import kerho.Kerho;
20  import kerho.SailoException;
21  
22  import fi.jyu.mit.gui.AbstractChooser;
23  import fi.jyu.mit.gui.IStringListChooser;
24  import fi.jyu.mit.gui.SelectionChangeListener;
25  import fi.jyu.mit.gui.StringTable;
26  import fi.jyu.mit.gui.TextAreaOutputStream;
27  
28  
29  
30  /**
31   * Luokka joka käsittelee kerhoa Swing-komponenteilla.
32   * Luokan käyttö:
33   * <pre>
34   * 1) Tee jollakin tavalla lomake, jossa on tarvittavat komponentit
35   * 2) Laita lomakkeelle myös Lisää ja Talleta -napit niin halutessasi
36   * 3) Luo koodissa lomakkeella KerhoSwing-olio
37   * <pre>
38   *        kerhoswing = new KerhoSwing();
39   *        kerhoswing.setListJasenet(listJasenet);
40   *        kerhoswing.setEditHaku(editHaku);
41   *        kerhoswing.setCbKentat(cbKentat);
42   *        kerhoswing.setTableHarrastukset(tableHarrastus);
43   *        kerhoswing.setPanelJasen(boxJasen);
44   *        kerhoswing.setLabelVirhe(labelVirhe);
45   *        
46   *        String virhe = kerhoswing.lueTiedosto("kelmit");
47   *        if ( virhe != null ) JOptionPane.showMessageDialog(null, virhe);
48   * </pre>       
49   * 4) Kutsu nappien tapahtumista mm. olion lisaa ja talleta -metodeja.
50   *         kerhoswing.lisaa();
51   *         kerhoswing.talleta();
52   * 5) Jotta kaikki tulee talletettua, kutsu ohjelmasta poistuvissa paikoissa
53   *         kerhoswing.talleta();        
54   * </pre>
55   * @author vesal
56   * @version 10.4.2009
57   * @version 30.1.2012 - gui-komponenteilla
58   * @version 16.2.2012 - lisätty jäsenien käsittely
59   */
60  public class KerhoSwing {
61  
62      private static Color virheVari = new Color(255, 0, 0);
63      //private static Color normaaliVari = new Color(255, 255, 255);
64      private AbstractChooser<String> cbKentat;
65      private JTextField editHaku;
66      private AbstractChooser<Jasen> listJasenet;
67      private StringTable tableHarrastukset;
68      private JComponent panelJasen;
69      private JLabel labelVirhe;
70      private final Kerho kerho;
71      
72      private Jasen jasenKohdalla;
73      private JTextArea areaJasen = new JTextArea(); // TODO tilapäinen tulostusalue
74      
75      /**
76       * Alustaa luokan niin, että se voi käyttää  Swing-komponentteja
77       */
78      public KerhoSwing() {
79          kerho = new Kerho();
80      }
81  
82  
83      /**
84       * @return mihin näytetään virheteksti
85       */
86      public JLabel getLabelVirhe() {
87          return labelVirhe;
88      }
89  
90  
91      /**
92       * @param labelVirhe mihin näytetään virheteksti
93       */
94      public void setLabelVirhe(JLabel labelVirhe) {
95          this.labelVirhe = labelVirhe;
96      }
97  
98  
99      /**
100      * @return combobox jossa kenttälista 
101      */
102     public AbstractChooser<String> getCbKentat() {
103         return cbKentat;
104     }
105 
106 
107     /**
108      * @param cbKentat comboboxkenttälistaa varten
109      */
110     public void setCbKentat(AbstractChooser<String> cbKentat) {
111         this.cbKentat = cbKentat;
112     }
113 
114 
115     /**
116      * @return edit jossa hakuehto
117      */
118     public JTextField getEditHaku() {
119         return editHaku;
120     }
121 
122 
123     /**
124      * @param editHaku edit johon saa kirjoittaa hakuehdon
125      */
126     public void setEditHaku(JTextField editHaku) {
127         this.editHaku = editHaku;
128     }
129 
130 
131     /**
132      * @return lista johon jäsenet laitetaan
133      */
134     public AbstractChooser<Jasen> getListJasenet() {
135         return listJasenet;
136     }
137 
138 
139     /**
140      * @param listJasenet lista johon jäsenet laitetaan
141      */
142     @SuppressWarnings({ "rawtypes", "unchecked" })
143     public void setListJasenet(AbstractChooser listJasenet) {
144         this.listJasenet = listJasenet;
145     }
146 
147 
148     /**
149      * @return taulukko johon tulee jäsenen harrastukset
150      */
151     public StringTable getTableHarrastukset() {
152         return tableHarrastukset;
153     }
154 
155 
156     /**
157      * @param tableHarrastukset taulukko johon tulee jäsenen harrastukset
158      */
159     public void setTableHarrastukset(StringTable tableHarrastukset) {
160         this.tableHarrastukset = tableHarrastukset;
161     }
162 
163 
164     /**
165      * @return alue johon lisätään jäsenen yksittäiset kentät.
166      */
167     public JComponent getPanelJasen() {
168         return panelJasen;
169     }
170 
171 
172     /**
173      * @param panelJasen alue johon lisätään jäsenen tiedot.  Mielellään joku johon tulevat alekkain
174      */
175     public void setPanelJasen(JComponent panelJasen) {
176         this.panelJasen = panelJasen;
177     }
178 
179 
180     /**
181      * Tämä alustaa valitut alueet käyttökuntoon.
182      */
183     public void alusta() {
184         // TODO: tätä voidaan vielä turhaan kutsua monta kertaa
185         
186         editHaku.addKeyListener(new KeyAdapter() {
187             @Override  public void keyReleased(KeyEvent e) { hae(0); }
188         });
189 
190         cbKentat.addSelectionChangeListener(new SelectionChangeListener<String>() {
191             @Override
192             public void selectionChange(IStringListChooser<String> sender) { hae(0);}
193         });
194 
195         listJasenet.addSelectionChangeListener(new SelectionChangeListener<Jasen>() {
196             @Override
197             public void selectionChange(IStringListChooser<Jasen> sender) { naytaJasen(); }
198         });
199         luoNaytto();
200         hae(0);
201     }
202 
203 
204     /**
205      * Tekee uuden tyhjän jäsenen editointia varten
206      */
207     public void uusiJasen() {
208         jasenKohdalla = new Jasen();
209         jasenKohdalla.rekisteroi();
210         jasenKohdalla.vastaaAkuAnkka();
211         try {
212             kerho.lisaa(jasenKohdalla);
213         } catch (SailoException e) {
214             JOptionPane.showMessageDialog(null,
215                     "Ongelmia lisäämisessä! " + e.getMessage());
216         }
217         hae(jasenKohdalla.getTunnusNro());
218     }
219 
220 
221     /**
222      * Tekee uuden tyhjän harrastuksen editointia varten
223      */
224     public void uusiHarrastus() {
225         JOptionPane.showMessageDialog(null, "Vielä ei osata lisätä harrastusta!" );
226     }
227 
228 
229     /**
230      * Lukee kerhon tiedot tiedostosta. Tarkistetaan aluksi että kaikki
231      * kentät on asetettu paikalleen.
232      * @param s tiedoston nimi
233      * @return null jos onnistuu, muuten virheilmoitus
234      */
235     public String lueTiedosto(String s) {
236         try {
237             if ( cbKentat == null ) return "cbKentat on alustamatta";
238             if ( editHaku == null ) return "editHaku on alustamatta";
239             if ( listJasenet == null ) return "listJasenet on alustamatta";
240             if ( tableHarrastukset == null ) return "tableHarrastukset on alustamatta";
241             if ( panelJasen == null ) return "panelJasen on alsutamatta";
242             alusta();
243             kerho.lueTiedostosta(s);
244             hae(0);
245             return null;
246         } catch (SailoException e) {
247             hae(0);
248             // uusiJasen();
249             return e.getMessage();
250         }
251     }
252 
253 
254     /**
255      * Tallettaa nykyisen mahdollisesti muutetun jäsenen ja sitten koko tiedoston
256      * @return null jos menee hyvin, muuten virheteksti
257      */
258     public String talleta() {
259         try {
260             kerho.talleta();
261             return null;
262         } catch (SailoException ex) {
263             JOptionPane.showMessageDialog(null, "Talletuksessa ongelmia! " + ex.getMessage());
264             return ex.getMessage();
265         }
266     }
267 
268 
269     /**
270      * Suorittaa niiden jäsenten hakemisen, joiden valittu kenttä täyttää hakuehdon
271      * @param jnro jäsenen numero, joka aktivoidaan haun jälkeen
272      */
273     protected void hae(int jnro) {
274         int k = cbKentat.getSelectedIndex();
275         String hakuehto = editHaku.getText();
276         if ( k > 0 || hakuehto.length() > 0 ) 
277             setVirhe(String.format("Ei osata hakea (kenttä: %d, ehto: %s)",k,hakuehto));
278         else
279             setVirhe(null);
280 
281         listJasenet.clear();
282         
283         int index = 0;
284         for (int i = 0; i < kerho.getJasenia(); i++) {
285             Jasen jasen = kerho.annaJasen(i);
286             if (jasen.getTunnusNro() == jnro) index = i;
287             listJasenet.add(jasen.getNimi(),jasen);
288         }
289 
290         listJasenet.setSelectedIndex(index);
291     }
292 
293     
294     /**
295      * Näyttää jäsenen tiedot jäsenen alueeseen
296      */
297     private void laitaJasen() {
298         if (jasenKohdalla == null) return;
299         areaJasen.setText("");
300         PrintStream os = TextAreaOutputStream.getTextPrintStream(areaJasen);
301         tulosta(os, jasenKohdalla);
302     }
303     
304     
305     /**
306      * Näyttää listasta valitun jäsenen tiedot
307      */
308     protected void naytaJasen() {
309         int ind = listJasenet.getSelectedIndex();
310         if (ind < 0) return;
311         jasenKohdalla = listJasenet.getSelectedObject();
312         laitaJasen();
313     }
314 
315 
316     /**
317      * Laitetaan virheilmoitus näkyville jos labelVirhe on alustettu.
318      * Miksä virhettä ei ole, niin piilotetaan virheilmoitus.    
319      * @param virhe virheteksti
320      */
321     private void setVirhe(String virhe) {
322         if ( labelVirhe == null ) return;
323         if ( virhe == null ) {
324             labelVirhe.setVisible(false);
325             return;
326         }
327         labelVirhe.setVisible(true);
328         labelVirhe.setText(virhe);
329         labelVirhe.setBackground(virheVari);
330     }
331 
332    
333     /**
334      * Luo panelJasen:een paikan johon jäsen tiedot voi tulostaa
335      * TODO: vaihdettava editPanelien luomiseksi
336      */
337     private void luoNaytto() {
338         panelJasen.removeAll();
339         panelJasen.add(areaJasen);
340     }
341     
342     
343     /**
344      * Poistetaan harrastustaulukosta valitulla kohdalla oleva harrastus.
345      */
346     public void poistaHarrastus() {
347         int ind = tableHarrastukset.getSelectedRow();
348         if (ind < 0 ) return;
349         String har = (String)(tableHarrastukset.getValueAt(ind, 0));
350         JOptionPane.showMessageDialog(null, "Vielä ei osata poistaa harrastusta " + har);
351     }
352 
353 
354     /**
355      * Poistetaan listasta valittu jäsen.
356      */
357     public void poistaJasen() {
358         int ind = listJasenet.getSelectedIndex();
359         if ( ind < 0 ) return;
360         String nimi = listJasenet.getSelectedText();
361         int vastaus = JOptionPane.showConfirmDialog(null, "Poistetaanko jäsen: " + nimi,"Poisto?",JOptionPane.YES_NO_OPTION);
362         if ( vastaus == JOptionPane.NO_OPTION ) return;
363         JOptionPane.showMessageDialog(null, "Vielä ei osata poistaa jäsentä " + nimi);
364     }
365 
366 
367 
368     /**
369      * Avataan ulkoinen selain näyttämään avustustekstiä.
370      */
371     public void avustus() {
372         Desktop desktop = Desktop.getDesktop();
373         try {
374             //URI uri = new URI("kerho.html");
375             URI uri = new URI("https://trac.cc.jyu.fi/projects/ohj2k12/wiki/vesal2");
376             desktop.browse(uri);
377         } catch (URISyntaxException e) {
378             return;
379         } catch (IOException e) {
380             return;
381         }
382     }
383 
384 
385     /**
386      * Tulostaa jäsenen tiedot
387      * @param os tietovirta johon tulostetaan
388      * @param jasen tulostettava jäsen
389      */
390     public void tulosta(PrintStream os, final Jasen jasen) {
391         os.println("----------------------------------------------");
392         jasen.tulosta(os);
393         os.println("----------------------------------------------");
394     }
395     
396     
397     /**
398      * Tulostaa listassa olevat jäsenet tekstialueeseen
399      * @param text alue johon tulostetaan
400      */
401     public void tulostaValitut(JTextArea text) {
402         PrintStream os = TextAreaOutputStream.getTextPrintStream(text);
403         os.println("Tulostetaan kaikki jäsenet");
404         for (int i = 0; i < kerho.getJasenia(); i++) {
405             Jasen jasen = kerho.annaJasen(i);
406             tulosta(os, jasen);
407             os.println("\n\n");
408         }    
409     }
410 
411 
412 }
413