1 package kerhoswing;
2
3 import java.awt.Color;
4 import java.awt.event.ActionEvent;
5 import java.awt.event.ActionListener;
6 import java.awt.event.KeyAdapter;
7 import java.awt.event.KeyEvent;
8 import java.util.Collection;
9 import javax.swing.JComboBox;
10
11 import javax.swing.JList;
12 import javax.swing.JTextField;
13 import javax.swing.DefaultListModel;
14 import javax.swing.JLabel;
15 import javax.swing.JOptionPane;
16 import javax.swing.JPanel;
17 import javax.swing.event.ListSelectionEvent;
18 import javax.swing.event.ListSelectionListener;
19 import kerho.Jasen;
20 import kerho.Kerho;
21 import kerho.SailoException;
22 import static javax.swing.SwingConstants.*;
23
24
43 public class KerhoSwing {
44
45 private static Color virheVari = new Color(255, 0, 0);
46 private static Color normaaliVari = new Color(255, 255, 255);
47 private final static Jasen apujasen = new Jasen();
48 private final JComboBox cbKentat;
49 private final JTextField editHaku;
50 private final JList listJasenet;
51 private final JPanel panelJasen;
52 private final Kerho kerho;
53 private final DefaultListModel listModel = new DefaultListModel();
54 private Jasen jasen; private Jasen editJasen; private JTextField edits[];
58
65 public KerhoSwing(JComboBox cbKentat, JTextField editHaku, JList listJasenet, JPanel panelJasen) {
66 kerho = new Kerho();
67 this.cbKentat = cbKentat;
68 this.editHaku = editHaku;
69 this.listJasenet = listJasenet;
70 this.panelJasen = panelJasen;
71
72
73 cbKentat.removeAllItems();
74 listJasenet.setModel(listModel);
75
76 for (int k = apujasen.ekaKentta(); k < apujasen.getKenttia(); k++) {
77 cbKentat.addItem(apujasen.getKysymys(k));
78 }
79
80 editHaku.addKeyListener(new KeyAdapter() {
81 @Override public void keyReleased(KeyEvent e) { hae(); }
82 });
83
84 cbKentat.addActionListener(new ActionListener() {
85 public void actionPerformed(ActionEvent e) { hae();}
86 });
87
88 listJasenet.addListSelectionListener(new ListSelectionListener() {
89 public void valueChanged(ListSelectionEvent e) { nayta(); }
90 });
91
92 luoNaytto();
93 hae();
94 }
95
96
97
101 private void setEditJasen(Jasen j) {
102 editJasen = j;
103 }
104
105
106
109 public void lisaa() {
110 tarkistaMuutos();
111 jasen = new Jasen();
112 jasen.rekisteroi();
113 setEditJasen(null);
114 laitaJasen();
115 }
116
117
118
123 public String lueTiedosto(String s) {
124 try {
125 kerho.lueTiedostosta(s);
126 hae();
127 return null;
128 } catch (SailoException e) {
129 hae();
130 return e.getMessage();
131 }
132
133 }
134
135
136
141 private boolean muuttunut() {
142 if ( jasen == null ) return false;
143 if ( editJasen == null ) return false;
144 return !jasen.equals(editJasen);
145 }
146
147
148
152 public String talleta() {
153 try {
154 if ( muuttunut() ) { kerho.korvaa(editJasen); jasen = editJasen; }
155 setEditJasen(null);
156 hae();
157 kerho.talleta();
158 return null;
159 } catch (SailoException ex) {
160 JOptionPane.showMessageDialog(null, "Talletuksessa ongelmia! " + ex.getMessage());
161 return ex.getMessage();
162 }
163 }
164
165
166
170 private static class JasenList {
171 private final Jasen jasen;
172 public JasenList(Jasen jasen) {
173 this.jasen = jasen;
174 }
175
176 public Jasen getJasen() {
177 return jasen;
178 }
179
180 @Override
181 public String toString() {
182 return jasen.anna(jasen.ekaKentta());
183 }
184
185 }
186
187
190 private void hae() {
191 int k = cbKentat.getSelectedIndex() + apujasen.ekaKentta();
192 String ehto = editHaku.getText();
193 if (ehto.indexOf('*') < 0) {
194 ehto = "*" + ehto + "*";
195 }
196 Collection<Jasen> tulos = kerho.etsi(ehto, k);
197 listModel.removeAllElements();
198
199 for (Jasen j : tulos) {
200 listModel.addElement(new JasenList(j)); }
202 }
203
204
205
208 private void laitaJasen() {
209 if ( jasen == null ) return;
210 for (int i = 0, k = jasen.ekaKentta(); k < jasen.getKenttia(); k++, i++) {
211 edits[i].setText(jasen.anna(k));
212 edits[i].setBackground(normaaliVari);
213 edits[i].setToolTipText("");
214 }
215 }
216
217
218
221 public void tarkistaMuutos() {
222 if ( muuttunut() ) {
223 int vastaus = JOptionPane.showConfirmDialog(null, "Talletetaanko?", "Jäsen muuttunut!", JOptionPane.YES_NO_OPTION);
224 if ( vastaus == JOptionPane.YES_OPTION ) talleta();
225 }
226 }
227
228
229
232 private void nayta() {
233 int ind = listJasenet.getSelectedIndex();
234 if (ind < 0) return;
235 tarkistaMuutos();
236 jasen = ((JasenList)listModel.get(ind)).getJasen();
237 setEditJasen(null);
238 laitaJasen();
239 }
240
241
242
251 private void kasitteleMuutos(JTextField edit) {
252 if (jasen == null) {
253 jasen = new Jasen();
254 jasen.rekisteroi();
255 setEditJasen(null);
256 }
257 if ( editJasen == null ) setEditJasen(jasen.clone());
258 String s = edit.getText();
259 int k = Integer.parseInt(edit.getName().substring(1));
260 String virhe = editJasen.aseta(k, s);
261 if (virhe == null) {
262 edit.setToolTipText("");
263 edit.setBackground(normaaliVari);
264 } else {
265 edit.setToolTipText(virhe);
266 edit.setBackground(virheVari);
267 }
268 }
269
270
271
274 private void luoNaytto() {
275 int n = apujasen.getKenttia() - apujasen.ekaKentta();
276 edits = new JTextField[n];
277 panelJasen.setLayout(new java.awt.GridLayout(n, 2, 10, 2));
278
279 for (int i = 0, k = apujasen.ekaKentta(); k < apujasen.getKenttia(); k++, i++) {
280 JLabel jLabel = new JLabel(apujasen.getKysymys(k)); jLabel.setName("jLabel" + k);
282 jLabel.setHorizontalAlignment(TRAILING);
283 panelJasen.add(jLabel);
284 JTextField edit = new JTextField(""); edits[i] = edit;
286 edit.setName("e" + k);
287 panelJasen.add(edit);
288 edit.addKeyListener(new KeyAdapter() { @Override
290 public void keyReleased(KeyEvent e) {
291 kasitteleMuutos((JTextField) e.getComponent());
292 }
293 });
294 }
295 }
296 }
297