1 | package cz.frantovo.superPostak; |
---|
2 | |
---|
3 | import cz.frantovo.gui.tabulky.TableSorterModel; |
---|
4 | import cz.frantovo.postak.InternetAddressKomu; |
---|
5 | import cz.frantovo.postak.Postak; |
---|
6 | import java.awt.Cursor; |
---|
7 | import java.io.BufferedReader; |
---|
8 | import java.io.File; |
---|
9 | import java.io.FileReader; |
---|
10 | import java.io.FileWriter; |
---|
11 | import java.io.OutputStreamWriter; |
---|
12 | import java.util.ArrayList; |
---|
13 | import java.util.Collection; |
---|
14 | import java.util.HashSet; |
---|
15 | import java.util.logging.Level; |
---|
16 | import java.util.logging.Logger; |
---|
17 | import javax.swing.DefaultListSelectionModel; |
---|
18 | import javax.swing.JFileChooser; |
---|
19 | import javax.swing.event.TableModelEvent; |
---|
20 | import javax.swing.event.TableModelListener; |
---|
21 | import javax.swing.table.TableModel; |
---|
22 | |
---|
23 | /** |
---|
24 | * |
---|
25 | * @author fiki |
---|
26 | */ |
---|
27 | public class PanelPrijemcu extends javax.swing.JPanel { |
---|
28 | |
---|
29 | private static Logger log = Logger.getLogger(PanelPrijemcu.class.getName()); |
---|
30 | private ModelTabulky data = new ModelTabulky(); |
---|
31 | |
---|
32 | /** Creates new form PanelPrijemcu */ |
---|
33 | public PanelPrijemcu() { |
---|
34 | initComponents(); |
---|
35 | tabulka.setModel(data); |
---|
36 | tabulka.setSelectionMode(DefaultListSelectionModel.SINGLE_SELECTION); |
---|
37 | } |
---|
38 | |
---|
39 | public ArrayList<InternetAddressKomu> getAdresy() { |
---|
40 | /** TODO: vracet kopii? */ |
---|
41 | return data.data; |
---|
42 | } |
---|
43 | |
---|
44 | /** |
---|
45 | * @param prijemci pokud je null, nastaví prázdná kolekce. |
---|
46 | */ |
---|
47 | public void setAdresy(Collection<InternetAddressKomu> adresy) { |
---|
48 | data.data = new ArrayList<InternetAddressKomu>(); |
---|
49 | pridejAdresu(adresy); |
---|
50 | } |
---|
51 | |
---|
52 | public void pridejAdresu(Collection<InternetAddressKomu> adresy) { |
---|
53 | if (adresy == null) { |
---|
54 | log.log(Level.FINER, "Prázdná množina adres - nic nepřidáme"); |
---|
55 | } else { |
---|
56 | data.data.addAll(adresy); |
---|
57 | data.upozorniPosluchace(); |
---|
58 | } |
---|
59 | } |
---|
60 | |
---|
61 | /** |
---|
62 | * Pokud je needitovatelný, nelze měnit data v tabuce |
---|
63 | * a z tlačítek je povoleno pouze tlačítko pro uložení do souboru. |
---|
64 | */ |
---|
65 | public void setEditovatelny(boolean editovatelny) { |
---|
66 | otevrit.setEnabled(editovatelny); |
---|
67 | pridat.setEnabled(editovatelny); |
---|
68 | odebrat.setEnabled(editovatelny); |
---|
69 | tabulka.setEnabled(editovatelny); |
---|
70 | } |
---|
71 | |
---|
72 | /** This method is called from within the constructor to |
---|
73 | * initialize the form. |
---|
74 | * WARNING: Do NOT modify this code. The content of this method is |
---|
75 | * always regenerated by the Form Editor. |
---|
76 | */ |
---|
77 | // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents |
---|
78 | private void initComponents() { |
---|
79 | |
---|
80 | jScrollPane1 = new javax.swing.JScrollPane(); |
---|
81 | tabulka = new cz.frantovo.gui.tabulky.JTable(); |
---|
82 | pridat = new javax.swing.JButton(); |
---|
83 | odebrat = new javax.swing.JButton(); |
---|
84 | ulozit = new javax.swing.JButton(); |
---|
85 | otevrit = new javax.swing.JButton(); |
---|
86 | |
---|
87 | tabulka.setModel(new javax.swing.table.DefaultTableModel( |
---|
88 | new Object [][] { |
---|
89 | {null, null, null, null}, |
---|
90 | {null, null, null, null}, |
---|
91 | {null, null, null, null}, |
---|
92 | {null, null, null, null} |
---|
93 | }, |
---|
94 | new String [] { |
---|
95 | "Title 1", "Title 2", "Title 3", "Title 4" |
---|
96 | } |
---|
97 | )); |
---|
98 | jScrollPane1.setViewportView(tabulka); |
---|
99 | |
---|
100 | pridat.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/frantovo/superPostak/obrazky/vlozit.png"))); // NOI18N |
---|
101 | pridat.setMnemonic('i'); |
---|
102 | pridat.setText("Přidat"); |
---|
103 | pridat.setToolTipText("<html>\nPřidá prázdný řádek pro vložení nového příjemce<br/>\nAby se napsaná změna projevila, je potřeba kliknout jinam do tabulky<br/>\n(tzn. ukončit režim editace buňky)<br/>\n</html>"); |
---|
104 | pridat.addActionListener(new java.awt.event.ActionListener() { |
---|
105 | public void actionPerformed(java.awt.event.ActionEvent evt) { |
---|
106 | pridatActionPerformed(evt); |
---|
107 | } |
---|
108 | }); |
---|
109 | |
---|
110 | odebrat.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/frantovo/superPostak/obrazky/editdelete.png"))); // NOI18N |
---|
111 | odebrat.setMnemonic('r'); |
---|
112 | odebrat.setText("Odebrat"); |
---|
113 | odebrat.setToolTipText("Odebere vybraného příjemce"); |
---|
114 | odebrat.addActionListener(new java.awt.event.ActionListener() { |
---|
115 | public void actionPerformed(java.awt.event.ActionEvent evt) { |
---|
116 | odebratActionPerformed(evt); |
---|
117 | } |
---|
118 | }); |
---|
119 | |
---|
120 | ulozit.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/frantovo/superPostak/obrazky/ulozit.png"))); // NOI18N |
---|
121 | ulozit.setToolTipText("Uložit seznam příjemců do souboru."); |
---|
122 | ulozit.addActionListener(new java.awt.event.ActionListener() { |
---|
123 | public void actionPerformed(java.awt.event.ActionEvent evt) { |
---|
124 | ulozitActionPerformed(evt); |
---|
125 | } |
---|
126 | }); |
---|
127 | |
---|
128 | otevrit.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/frantovo/superPostak/obrazky/otevrit.png"))); // NOI18N |
---|
129 | otevrit.setToolTipText("<html>Přidat příjemce ze souboru.<br/>Na každém řádku se očekává jedna adresa.</html>"); |
---|
130 | otevrit.addActionListener(new java.awt.event.ActionListener() { |
---|
131 | public void actionPerformed(java.awt.event.ActionEvent evt) { |
---|
132 | otevritActionPerformed(evt); |
---|
133 | } |
---|
134 | }); |
---|
135 | |
---|
136 | javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); |
---|
137 | this.setLayout(layout); |
---|
138 | layout.setHorizontalGroup( |
---|
139 | layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) |
---|
140 | .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() |
---|
141 | .addContainerGap(97, Short.MAX_VALUE) |
---|
142 | .addComponent(otevrit) |
---|
143 | .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) |
---|
144 | .addComponent(ulozit) |
---|
145 | .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) |
---|
146 | .addComponent(odebrat) |
---|
147 | .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) |
---|
148 | .addComponent(pridat) |
---|
149 | .addContainerGap()) |
---|
150 | .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 410, Short.MAX_VALUE) |
---|
151 | ); |
---|
152 | layout.setVerticalGroup( |
---|
153 | layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) |
---|
154 | .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() |
---|
155 | .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 253, Short.MAX_VALUE) |
---|
156 | .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) |
---|
157 | .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) |
---|
158 | .addComponent(pridat) |
---|
159 | .addComponent(odebrat) |
---|
160 | .addComponent(ulozit) |
---|
161 | .addComponent(otevrit)) |
---|
162 | .addContainerGap()) |
---|
163 | ); |
---|
164 | }// </editor-fold>//GEN-END:initComponents |
---|
165 | private void pridatActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_pridatActionPerformed |
---|
166 | data.pridejRadek(); |
---|
167 | }//GEN-LAST:event_pridatActionPerformed |
---|
168 | |
---|
169 | private void odebratActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_odebratActionPerformed |
---|
170 | int radkaV = tabulka.getSelectedRow(); |
---|
171 | int radka = ((TableSorterModel) tabulka.getModel()).modelIndex(radkaV); |
---|
172 | if (radka > -1 && radka < data.getRowCount()) { |
---|
173 | data.odeberRadek(radka); |
---|
174 | } |
---|
175 | }//GEN-LAST:event_odebratActionPerformed |
---|
176 | |
---|
177 | private void ulozitActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ulozitActionPerformed |
---|
178 | JFileChooser dialog = new JFileChooser(); |
---|
179 | dialog.setMultiSelectionEnabled(false); |
---|
180 | dialog.setDialogTitle("Uložit seznam do souboru"); |
---|
181 | int vysledek = dialog.showSaveDialog(this); |
---|
182 | if (vysledek == JFileChooser.APPROVE_OPTION) { |
---|
183 | File soubor = dialog.getSelectedFile(); |
---|
184 | try { |
---|
185 | setCursor(new Cursor(Cursor.WAIT_CURSOR)); |
---|
186 | OutputStreamWriter zapisovac = new FileWriter(soubor); |
---|
187 | int pocetDobrych = 0; |
---|
188 | int pocetPreskocenych = 0; |
---|
189 | |
---|
190 | for (InternetAddressKomu adresa : data.data) { |
---|
191 | /** TODO: různé formátování, případně jména */ |
---|
192 | if (Postak.zkontrolujAdresu(adresa.getAddress())) { |
---|
193 | zapisovac.write(adresa.getAddress() + "\n"); |
---|
194 | pocetDobrych++; |
---|
195 | } else { |
---|
196 | pocetPreskocenych++; |
---|
197 | } |
---|
198 | } |
---|
199 | |
---|
200 | zapisovac.close(); |
---|
201 | String preskocene = ""; |
---|
202 | if (pocetPreskocenych > 0) { |
---|
203 | preskocene = "\nPočet přeskočených: " + pocetPreskocenych + "\n(Přeskočené neodpovídaly regulárnímu výrazu.)"; |
---|
204 | |
---|
205 | } |
---|
206 | SuperPostak.zobrazInformacniDialog(this, "Uložení seznamu", "Adresy příjemců byly úspěšně uloženy do souboru:\n" + soubor.getAbsolutePath() + "\nPočet uložených adres: " + pocetDobrych + preskocene, true); |
---|
207 | } catch (Exception e) { |
---|
208 | SuperPostak.zobrazChybovyDialog(this, "Uložení seznamu selhalo", "Adresy se nepodařilo uložit do souboru.", null, e, Level.WARNING, false); |
---|
209 | } finally { |
---|
210 | setCursor(Cursor.getDefaultCursor()); |
---|
211 | } |
---|
212 | } |
---|
213 | }//GEN-LAST:event_ulozitActionPerformed |
---|
214 | |
---|
215 | private void otevritActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_otevritActionPerformed |
---|
216 | JFileChooser dialog = new JFileChooser(); |
---|
217 | dialog.setMultiSelectionEnabled(false); |
---|
218 | dialog.setDialogTitle("Načíst adresy ze souboru"); |
---|
219 | int vysledek = dialog.showOpenDialog(this); |
---|
220 | if (vysledek == JFileChooser.APPROVE_OPTION) { |
---|
221 | File soubor = dialog.getSelectedFile(); |
---|
222 | try { |
---|
223 | setCursor(new Cursor(Cursor.WAIT_CURSOR)); |
---|
224 | BufferedReader ctenar = new BufferedReader(new FileReader(soubor)); |
---|
225 | int pocetDobrych = 0; |
---|
226 | int pocetPreskocenych = 0; |
---|
227 | String radka = ctenar.readLine(); |
---|
228 | ArrayList<InternetAddressKomu> adresy = new ArrayList<InternetAddressKomu>(); |
---|
229 | |
---|
230 | while (radka != null) { |
---|
231 | if (Postak.zkontrolujAdresu(radka)) { |
---|
232 | adresy.add(new InternetAddressKomu(radka, null)); |
---|
233 | pocetDobrych++; |
---|
234 | |
---|
235 | } else { |
---|
236 | pocetPreskocenych++; |
---|
237 | } |
---|
238 | |
---|
239 | radka = ctenar.readLine(); |
---|
240 | } |
---|
241 | |
---|
242 | setAdresy(adresy); |
---|
243 | ctenar.close(); |
---|
244 | String preskocene = ""; |
---|
245 | if (pocetPreskocenych > 0) { |
---|
246 | preskocene = "\nPočet přeskočených: " + pocetPreskocenych + "\n(Přeskočené neodpovídaly regulárnímu výrazu.)"; |
---|
247 | |
---|
248 | } |
---|
249 | |
---|
250 | SuperPostak.zobrazInformacniDialog(this, "Načtení adres", "Byl načten seznam adres ze souboru:\n" + soubor.getAbsolutePath() + "\nPočet načtených adres: " + pocetDobrych + preskocene, true); |
---|
251 | } catch (Exception e) { |
---|
252 | SuperPostak.zobrazChybovyDialog(this, "Načtení souboru selhalo", "Nepodařilo se načíst soubor s adresami.", null, e, Level.WARNING, false); |
---|
253 | } finally { |
---|
254 | setCursor(Cursor.getDefaultCursor()); |
---|
255 | } |
---|
256 | |
---|
257 | } |
---|
258 | }//GEN-LAST:event_otevritActionPerformed |
---|
259 | |
---|
260 | // Variables declaration - do not modify//GEN-BEGIN:variables |
---|
261 | private javax.swing.JScrollPane jScrollPane1; |
---|
262 | private javax.swing.JButton odebrat; |
---|
263 | private javax.swing.JButton otevrit; |
---|
264 | private javax.swing.JButton pridat; |
---|
265 | private cz.frantovo.gui.tabulky.JTable tabulka; |
---|
266 | private javax.swing.JButton ulozit; |
---|
267 | // End of variables declaration//GEN-END:variables |
---|
268 | private class ModelTabulky implements TableModel { |
---|
269 | |
---|
270 | private String[] sloupecky = {"Jméno", "e-mail"}; |
---|
271 | private ArrayList<InternetAddressKomu> data = new ArrayList<InternetAddressKomu>(); |
---|
272 | private HashSet<TableModelListener> posluchace = new HashSet<TableModelListener>(); |
---|
273 | |
---|
274 | public int getRowCount() { |
---|
275 | return data.size(); |
---|
276 | } |
---|
277 | |
---|
278 | public int getColumnCount() { |
---|
279 | return sloupecky.length; |
---|
280 | } |
---|
281 | |
---|
282 | public String getColumnName(int n) { |
---|
283 | return sloupecky[n]; |
---|
284 | } |
---|
285 | |
---|
286 | public Class<?> getColumnClass(int n) { |
---|
287 | return String.class; |
---|
288 | } |
---|
289 | |
---|
290 | public boolean isCellEditable(int m, int n) { |
---|
291 | return true; |
---|
292 | } |
---|
293 | |
---|
294 | public Object getValueAt(int m, int n) { |
---|
295 | if (n == 0) { |
---|
296 | return data.get(m).getPersonal(); |
---|
297 | } else if (n == 1) { |
---|
298 | return data.get(m).getAddress(); |
---|
299 | } else { |
---|
300 | return null; |
---|
301 | } |
---|
302 | } |
---|
303 | |
---|
304 | public void setValueAt(Object value, int m, int n) { |
---|
305 | if (n == 0) { |
---|
306 | try { |
---|
307 | data.get(m).setPersonal(String.valueOf(value.toString())); |
---|
308 | } catch (Exception ex) { |
---|
309 | log.log(Level.SEVERE, "ModelTabulky.setValueAt(" + m + ", " + n + ")", ex); |
---|
310 | } |
---|
311 | } else if (n == 1) { |
---|
312 | data.get(m).setAddress(String.valueOf(value.toString())); |
---|
313 | } |
---|
314 | } |
---|
315 | |
---|
316 | public void addTableModelListener(TableModelListener l) { |
---|
317 | posluchace.add(l); |
---|
318 | } |
---|
319 | |
---|
320 | public void removeTableModelListener(TableModelListener l) { |
---|
321 | posluchace.remove(l); |
---|
322 | } |
---|
323 | |
---|
324 | public void pridejRadek() { |
---|
325 | data.add(new InternetAddressKomu()); |
---|
326 | |
---|
327 | upozorniPosluchace(); |
---|
328 | } |
---|
329 | |
---|
330 | public void odeberRadek(int m) { |
---|
331 | data.remove(m); |
---|
332 | upozorniPosluchace(); |
---|
333 | } |
---|
334 | |
---|
335 | private void upozorniPosluchace() { |
---|
336 | for (TableModelListener p : posluchace) { |
---|
337 | p.tableChanged(new TableModelEvent(this)); |
---|
338 | } |
---|
339 | } |
---|
340 | } |
---|
341 | } |
---|