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 fi.jyu.mit.gui.AbstractChooser;
19  import fi.jyu.mit.gui.IStringListChooser;
20  import fi.jyu.mit.gui.SelectionChangeListener;
21  import fi.jyu.mit.gui.StringTable;
22  import fi.jyu.mit.gui.TextAreaOutputStream;
23  
24  
25  
26  /**
27   * Luokka joka käsittelee kerhoa Swing-komponenteilla.
28   * Luokan käyttö:
29   * <pre>
30   * 1) Tee jollakin tavalla lomake, jossa on tarvittavat komponentit
31   * 2) Laita lomakkeelle myös Lisää ja Talleta -napit niin halutessasi
32   * 3) Luo koodissa lomakkeella KerhoSwing-olio
33   * <pre>
34   *        kerhoswing = new KerhoSwing();
35   *        kerhoswing.setListJasenet(listJasenet);
36   *        kerhoswing.setEditHaku(editHaku);
37   *        kerhoswing.setCbKentat(cbKentat);
38   *        kerhoswing.setTableHarrastukset(tableHarrastus);
39   *        kerhoswing.setPanelJasen(boxJasen);
40   *        kerhoswing.setLabelVirhe(labelVirhe);
41   *        
42   *        String virhe = kerhoswing.lueTiedosto("kelmit");
43   *        if ( virhe != null ) JOptionPane.showMessageDialog(null, virhe);
44   * </pre>       
45   * 4) Kutsu nappien tapahtumista mm. olion lisaa ja talleta -metodeja.
46   *         kerhoswing.lisaa();
47   *         kerhoswing.talleta();
48   * 5) Jotta kaikki tulee talletettua, kutsu ohjelmasta poistuvissa paikoissa
49   *         kerhoswing.talleta();        
50   * </pre>
51   * @author vesal
52   * @version 10.4.2009
53   * @version 1.1.2011 - lisätty harrastusten käsittely
54   * @version 30.1.2012 - gui-komponnteilla
55   */
56  public class KerhoSwing {
57  
58      private static Color virheVari = new Color(255, 0, 0);
59      //private static Color normaaliVari = new Color(255, 255, 255);
60      private AbstractChooser<String> cbKentat;
61      private JTextField editHaku;
62      private AbstractChooser<String> listJasenet;
63      private StringTable tableHarrastukset;
64      private JComponent panelJasen;
65      private JLabel labelVirhe;
66  
67  
68      /**
69       * Alustaa luokan niin, että se voi käyttää  Swing-komponentteja
70       */
71      public KerhoSwing() {
72          // vielä ei tarvita mitään
73      }
74  
75  
76      /**
77       * @return mihin näytetään virheteksti
78       */
79      public JLabel getLabelVirhe() {
80          return labelVirhe;
81      }
82  
83  
84      /**
85       * @param labelVirhe mihin näytetään virheteksti
86       */
87      public void setLabelVirhe(JLabel labelVirhe) {
88          this.labelVirhe = labelVirhe;
89      }
90  
91  
92      /**
93       * @return combobox jossa kenttälista 
94       */
95      public AbstractChooser<String> getCbKentat() {
96          return cbKentat;
97      }
98  
99  
100     /**
101      * @param cbKentat comboboxkenttälistaa varten
102      */
103     public void setCbKentat(AbstractChooser<String> cbKentat) {
104         this.cbKentat = cbKentat;
105     }
106 
107 
108     /**
109      * @return edit jossa hakuehto
110      */
111     public JTextField getEditHaku() {
112         return editHaku;
113     }
114 
115 
116     /**
117      * @param editHaku edit johon saa kirjoittaa hakuehdon
118      */
119     public void setEditHaku(JTextField editHaku) {
120         this.editHaku = editHaku;
121     }
122 
123 
124     /**
125      * @return lista johon jäsenet laitetaan
126      */
127     public AbstractChooser<String> getListJasenet() {
128         return listJasenet;
129     }
130 
131 
132     /**
133      * @param listJasenet lista johon jäsenet laitetaan
134      */
135     public void setListJasenet(AbstractChooser<String> listJasenet) {
136         this.listJasenet = listJasenet;
137     }
138 
139 
140     /**
141      * @return taulukko johon tulee jäsenen harrastukset
142      */
143     public StringTable getTableHarrastukset() {
144         return tableHarrastukset;
145     }
146 
147 
148     /**
149      * @param tableHarrastukset taulukko johon tulee jäsenen harrastukset
150      */
151     public void setTableHarrastukset(StringTable tableHarrastukset) {
152         this.tableHarrastukset = tableHarrastukset;
153     }
154 
155 
156     /**
157      * @return alue johon lisätään jäsenen yksittäiset kentät.
158      */
159     public JComponent getPanelJasen() {
160         return panelJasen;
161     }
162 
163 
164     /**
165      * @param panelJasen alue johon lisätään jäsenen tiedot.  Mielellään joku johon tulevat alekkain
166      */
167     public void setPanelJasen(JComponent panelJasen) {
168         this.panelJasen = panelJasen;
169     }
170 
171 
172     /**
173      * Tämä alustaa valitut alueet käyttökuntoon.
174      */
175     public void alusta() {
176         // TODO: tätä voidaan vielä turhaan kutsua monta kertaa
177         
178         editHaku.addKeyListener(new KeyAdapter() {
179             @Override  public void keyReleased(KeyEvent e) { hae(0); }
180         });
181 
182         cbKentat.addSelectionChangeListener(new SelectionChangeListener<String>() {
183             @Override
184             public void selectionChange(IStringListChooser<String> sender) { hae(0);}
185         });
186 
187         listJasenet.addSelectionChangeListener(new SelectionChangeListener<String>() {
188             @Override
189             public void selectionChange(IStringListChooser<String> sender) { naytaJasen(); }
190         });
191     }
192 
193 
194     /**
195      * Tekee uuden tyhjän jäsenen editointia varten
196      */
197     public void uusiJasen() {
198         JOptionPane.showMessageDialog(null, "Vielä ei osata lisätä jäsentä!" );
199     }
200 
201 
202     /**
203      * Tekee uuden tyhjän harrastuksen editointia varten
204      */
205     public void uusiHarrastus() {
206         JOptionPane.showMessageDialog(null, "Vielä ei osata lisätä harrastusta!" );
207     }
208 
209 
210     /**
211      * Lukee kerhon tiedot tiedostosta. Tarkistetaan aluksi että kaikki
212      * kentät on asetettu paikalleen.
213      * @param s tiedoston nimi
214      * @return null jos onnistuu, muuten virheilmoitus
215      */
216     public String lueTiedosto(String s) {
217             if ( cbKentat == null ) return "cbKentat on alustamatta";
218             if ( editHaku == null ) return "editHaku on alustamatta";
219             if ( listJasenet == null ) return "listJasenet on alustamatta";
220             if ( tableHarrastukset == null ) return "tableHarrastukset on alustamatta";
221             if ( panelJasen == null ) return "panelJasen on alsutamatta";
222             alusta();
223             return "Ei osata vielä lukea tiedostoa! " + s;
224     }
225 
226 
227     /**
228      * Tallettaa nykyisen mahdollisesti muutetun jäsenen ja sitten koko tiedoston
229      * @return null jos menee hyvin, muuten virheteksti
230      */
231     public String talleta() {
232         JOptionPane.showMessageDialog(null, "Talletuksessa ongelmia! " );
233         return "ei toimi vielä";
234     }
235 
236     
237     /**
238      * Suorittaa niiden jäsenten hakemisen, joiden valittu kenttä täyttää hakuehdon
239      * @param jnro jäsenen numero, joka aktivoidaan haun jälkeen
240      */
241     protected void hae(int jnro) {
242         int k = cbKentat.getSelectedIndex();
243         String hakuehto = editHaku.getText();
244         if ( k > 0 || hakuehto.length() > 0 ) 
245             setVirhe(String.format("Ei osata hakea (kenttä: %d, ehto: %s)",k,hakuehto));
246         else
247             setVirhe(null);
248         listJasenet.setSelectedIndex(jnro); // TODO indeksit ja jäsennumerot eivät ole samoja...
249     }
250 
251     
252     /**
253      * Näyttää listasta valitun jäsenen tiedot
254      */
255     protected void naytaJasen() {
256         int ind = listJasenet.getSelectedIndex();
257         if (ind < 0) return;
258         if ( ind > 0 ) setVirhe("Ei osata näyttää muuta kuin Ankka Aku");
259         else setVirhe(null);
260     }
261 
262 
263     /**
264      * Laitetaan virheilmoitus näkyville jos labelVirhe on alustettu.
265      * Miksä virhettä ei ole, niin piilotetaan virheilmoitus.    
266      * @param virhe virheteksti
267      */
268     private void setVirhe(String virhe) {
269         if ( labelVirhe == null ) return;
270         if ( virhe == null ) {
271             labelVirhe.setVisible(false);
272             return;
273         }
274         labelVirhe.setVisible(true);
275         labelVirhe.setText(virhe);
276         labelVirhe.setBackground(virheVari);
277     }
278 
279    
280     /**
281      * Poistetaan harrastustaulukosta valitulla kohdalla oleva harrastus.
282      */
283     public void poistaHarrastus() {
284         int ind = tableHarrastukset.getSelectedRow();
285         if (ind < 0 ) return;
286         String har = (String)(tableHarrastukset.getValueAt(ind, 0));
287         JOptionPane.showMessageDialog(null, "Vielä ei osata poistaa harrastusta " + har);
288     }
289 
290 
291     /**
292      * Poistetaan listasta valittu jäsen.
293      */
294     public void poistaJasen() {
295         int ind = listJasenet.getSelectedIndex();
296         if ( ind < 0 ) return;
297         String nimi = listJasenet.getSelectedText();
298         int vastaus = JOptionPane.showConfirmDialog(null, "Poistetaanko jäsen: " + nimi,"Poisto?",JOptionPane.YES_NO_OPTION);
299         if ( vastaus == JOptionPane.NO_OPTION ) return;
300         JOptionPane.showMessageDialog(null, "Vielä ei osata poistaa jäsentä " + nimi);
301     }
302 
303 
304 
305     /**
306      * Avataan ulkoinen selain näyttämään avustustekstiä.
307      */
308     public void avustus() {
309         Desktop desktop = Desktop.getDesktop();
310         try {
311             //URI uri = new URI("kerho.html");
312             URI uri = new URI("https://trac.cc.jyu.fi/projects/ohj2k11/wiki/vesal2");
313             desktop.browse(uri);
314         } catch (URISyntaxException e) {
315             return;
316         } catch (IOException e) {
317             return;
318         }
319     }
320 
321 
322     /**
323      * Tulostaa listassa olevat jäsenet tekstialueeseen
324      * @param text alue johon tulostetaan
325      */
326     public void tulostaValitut(JTextArea text) {
327         PrintStream os = TextAreaOutputStream.getTextPrintStream(text);
328         os.println("Tähän tulostuisi jäsenten tiedot");
329     }
330 
331 
332 }
333