1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/java/SuperPostak/src/cz/frantovo/superPostak/PanelPrijemcu.java Sun Nov 23 22:19:20 2008 +0100
1.3 @@ -0,0 +1,341 @@
1.4 +package cz.frantovo.superPostak;
1.5 +
1.6 +import cz.frantovo.gui.tabulky.TableSorterModel;
1.7 +import cz.frantovo.postak.InternetAddressKomu;
1.8 +import cz.frantovo.postak.Postak;
1.9 +import java.awt.Cursor;
1.10 +import java.io.BufferedReader;
1.11 +import java.io.File;
1.12 +import java.io.FileReader;
1.13 +import java.io.FileWriter;
1.14 +import java.io.OutputStreamWriter;
1.15 +import java.util.ArrayList;
1.16 +import java.util.Collection;
1.17 +import java.util.HashSet;
1.18 +import java.util.logging.Level;
1.19 +import java.util.logging.Logger;
1.20 +import javax.swing.DefaultListSelectionModel;
1.21 +import javax.swing.JFileChooser;
1.22 +import javax.swing.event.TableModelEvent;
1.23 +import javax.swing.event.TableModelListener;
1.24 +import javax.swing.table.TableModel;
1.25 +
1.26 +/**
1.27 + *
1.28 + * @author fiki
1.29 + */
1.30 +public class PanelPrijemcu extends javax.swing.JPanel {
1.31 +
1.32 + private static Logger log = Logger.getLogger(PanelPrijemcu.class.getName());
1.33 + private ModelTabulky data = new ModelTabulky();
1.34 +
1.35 + /** Creates new form PanelPrijemcu */
1.36 + public PanelPrijemcu() {
1.37 + initComponents();
1.38 + tabulka.setModel(data);
1.39 + tabulka.setSelectionMode(DefaultListSelectionModel.SINGLE_SELECTION);
1.40 + }
1.41 +
1.42 + public ArrayList<InternetAddressKomu> getAdresy() {
1.43 + /** TODO: vracet kopii? */
1.44 + return data.data;
1.45 + }
1.46 +
1.47 + /**
1.48 + * @param prijemci pokud je null, nastaví prázdná kolekce.
1.49 + */
1.50 + public void setAdresy(Collection<InternetAddressKomu> adresy) {
1.51 + data.data = new ArrayList<InternetAddressKomu>();
1.52 + pridejAdresu(adresy);
1.53 + }
1.54 +
1.55 + public void pridejAdresu(Collection<InternetAddressKomu> adresy) {
1.56 + if (adresy == null) {
1.57 + log.log(Level.FINER, "Prázdná množina adres - nic nepřidáme");
1.58 + } else {
1.59 + data.data.addAll(adresy);
1.60 + data.upozorniPosluchace();
1.61 + }
1.62 + }
1.63 +
1.64 + /**
1.65 + * Pokud je needitovatelný, nelze měnit data v tabuce
1.66 + * a z tlačítek je povoleno pouze tlačítko pro uložení do souboru.
1.67 + */
1.68 + public void setEditovatelny(boolean editovatelny) {
1.69 + otevrit.setEnabled(editovatelny);
1.70 + pridat.setEnabled(editovatelny);
1.71 + odebrat.setEnabled(editovatelny);
1.72 + tabulka.setEnabled(editovatelny);
1.73 + }
1.74 +
1.75 + /** This method is called from within the constructor to
1.76 + * initialize the form.
1.77 + * WARNING: Do NOT modify this code. The content of this method is
1.78 + * always regenerated by the Form Editor.
1.79 + */
1.80 + // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
1.81 + private void initComponents() {
1.82 +
1.83 + jScrollPane1 = new javax.swing.JScrollPane();
1.84 + tabulka = new cz.frantovo.gui.tabulky.JTable();
1.85 + pridat = new javax.swing.JButton();
1.86 + odebrat = new javax.swing.JButton();
1.87 + ulozit = new javax.swing.JButton();
1.88 + otevrit = new javax.swing.JButton();
1.89 +
1.90 + tabulka.setModel(new javax.swing.table.DefaultTableModel(
1.91 + new Object [][] {
1.92 + {null, null, null, null},
1.93 + {null, null, null, null},
1.94 + {null, null, null, null},
1.95 + {null, null, null, null}
1.96 + },
1.97 + new String [] {
1.98 + "Title 1", "Title 2", "Title 3", "Title 4"
1.99 + }
1.100 + ));
1.101 + jScrollPane1.setViewportView(tabulka);
1.102 +
1.103 + pridat.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/frantovo/superPostak/obrazky/vlozit.png"))); // NOI18N
1.104 + pridat.setMnemonic('i');
1.105 + pridat.setText("Přidat");
1.106 + 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>");
1.107 + pridat.addActionListener(new java.awt.event.ActionListener() {
1.108 + public void actionPerformed(java.awt.event.ActionEvent evt) {
1.109 + pridatActionPerformed(evt);
1.110 + }
1.111 + });
1.112 +
1.113 + odebrat.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/frantovo/superPostak/obrazky/editdelete.png"))); // NOI18N
1.114 + odebrat.setMnemonic('r');
1.115 + odebrat.setText("Odebrat");
1.116 + odebrat.setToolTipText("Odebere vybraného příjemce");
1.117 + odebrat.addActionListener(new java.awt.event.ActionListener() {
1.118 + public void actionPerformed(java.awt.event.ActionEvent evt) {
1.119 + odebratActionPerformed(evt);
1.120 + }
1.121 + });
1.122 +
1.123 + ulozit.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/frantovo/superPostak/obrazky/ulozit.png"))); // NOI18N
1.124 + ulozit.setToolTipText("Uložit seznam příjemců do souboru.");
1.125 + ulozit.addActionListener(new java.awt.event.ActionListener() {
1.126 + public void actionPerformed(java.awt.event.ActionEvent evt) {
1.127 + ulozitActionPerformed(evt);
1.128 + }
1.129 + });
1.130 +
1.131 + otevrit.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/frantovo/superPostak/obrazky/otevrit.png"))); // NOI18N
1.132 + otevrit.setToolTipText("<html>Přidat příjemce ze souboru.<br/>Na každém řádku se očekává jedna adresa.</html>");
1.133 + otevrit.addActionListener(new java.awt.event.ActionListener() {
1.134 + public void actionPerformed(java.awt.event.ActionEvent evt) {
1.135 + otevritActionPerformed(evt);
1.136 + }
1.137 + });
1.138 +
1.139 + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
1.140 + this.setLayout(layout);
1.141 + layout.setHorizontalGroup(
1.142 + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
1.143 + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
1.144 + .addContainerGap(97, Short.MAX_VALUE)
1.145 + .addComponent(otevrit)
1.146 + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1.147 + .addComponent(ulozit)
1.148 + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1.149 + .addComponent(odebrat)
1.150 + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1.151 + .addComponent(pridat)
1.152 + .addContainerGap())
1.153 + .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 410, Short.MAX_VALUE)
1.154 + );
1.155 + layout.setVerticalGroup(
1.156 + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
1.157 + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
1.158 + .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 253, Short.MAX_VALUE)
1.159 + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
1.160 + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
1.161 + .addComponent(pridat)
1.162 + .addComponent(odebrat)
1.163 + .addComponent(ulozit)
1.164 + .addComponent(otevrit))
1.165 + .addContainerGap())
1.166 + );
1.167 + }// </editor-fold>//GEN-END:initComponents
1.168 + private void pridatActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_pridatActionPerformed
1.169 + data.pridejRadek();
1.170 + }//GEN-LAST:event_pridatActionPerformed
1.171 +
1.172 + private void odebratActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_odebratActionPerformed
1.173 + int radkaV = tabulka.getSelectedRow();
1.174 + int radka = ((TableSorterModel) tabulka.getModel()).modelIndex(radkaV);
1.175 + if (radka > -1 && radka < data.getRowCount()) {
1.176 + data.odeberRadek(radka);
1.177 + }
1.178 + }//GEN-LAST:event_odebratActionPerformed
1.179 +
1.180 + private void ulozitActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ulozitActionPerformed
1.181 + JFileChooser dialog = new JFileChooser();
1.182 + dialog.setMultiSelectionEnabled(false);
1.183 + dialog.setDialogTitle("Uložit seznam do souboru");
1.184 + int vysledek = dialog.showSaveDialog(this);
1.185 + if (vysledek == JFileChooser.APPROVE_OPTION) {
1.186 + File soubor = dialog.getSelectedFile();
1.187 + try {
1.188 + setCursor(new Cursor(Cursor.WAIT_CURSOR));
1.189 + OutputStreamWriter zapisovac = new FileWriter(soubor);
1.190 + int pocetDobrych = 0;
1.191 + int pocetPreskocenych = 0;
1.192 +
1.193 + for (InternetAddressKomu adresa : data.data) {
1.194 + /** TODO: různé formátování, případně jména */
1.195 + if (Postak.zkontrolujAdresu(adresa.getAddress())) {
1.196 + zapisovac.write(adresa.getAddress() + "\n");
1.197 + pocetDobrych++;
1.198 + } else {
1.199 + pocetPreskocenych++;
1.200 + }
1.201 + }
1.202 +
1.203 + zapisovac.close();
1.204 + String preskocene = "";
1.205 + if (pocetPreskocenych > 0) {
1.206 + preskocene = "\nPočet přeskočených: " + pocetPreskocenych + "\n(Přeskočené neodpovídaly regulárnímu výrazu.)";
1.207 +
1.208 + }
1.209 + 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);
1.210 + } catch (Exception e) {
1.211 + SuperPostak.zobrazChybovyDialog(this, "Uložení seznamu selhalo", "Adresy se nepodařilo uložit do souboru.", null, e, Level.WARNING, false);
1.212 + } finally {
1.213 + setCursor(Cursor.getDefaultCursor());
1.214 + }
1.215 + }
1.216 + }//GEN-LAST:event_ulozitActionPerformed
1.217 +
1.218 + private void otevritActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_otevritActionPerformed
1.219 + JFileChooser dialog = new JFileChooser();
1.220 + dialog.setMultiSelectionEnabled(false);
1.221 + dialog.setDialogTitle("Načíst adresy ze souboru");
1.222 + int vysledek = dialog.showOpenDialog(this);
1.223 + if (vysledek == JFileChooser.APPROVE_OPTION) {
1.224 + File soubor = dialog.getSelectedFile();
1.225 + try {
1.226 + setCursor(new Cursor(Cursor.WAIT_CURSOR));
1.227 + BufferedReader ctenar = new BufferedReader(new FileReader(soubor));
1.228 + int pocetDobrych = 0;
1.229 + int pocetPreskocenych = 0;
1.230 + String radka = ctenar.readLine();
1.231 + ArrayList<InternetAddressKomu> adresy = new ArrayList<InternetAddressKomu>();
1.232 +
1.233 + while (radka != null) {
1.234 + if (Postak.zkontrolujAdresu(radka)) {
1.235 + adresy.add(new InternetAddressKomu(radka, null));
1.236 + pocetDobrych++;
1.237 +
1.238 + } else {
1.239 + pocetPreskocenych++;
1.240 + }
1.241 +
1.242 + radka = ctenar.readLine();
1.243 + }
1.244 +
1.245 + setAdresy(adresy);
1.246 + ctenar.close();
1.247 + String preskocene = "";
1.248 + if (pocetPreskocenych > 0) {
1.249 + preskocene = "\nPočet přeskočených: " + pocetPreskocenych + "\n(Přeskočené neodpovídaly regulárnímu výrazu.)";
1.250 +
1.251 + }
1.252 +
1.253 + 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);
1.254 + } catch (Exception e) {
1.255 + SuperPostak.zobrazChybovyDialog(this, "Načtení souboru selhalo", "Nepodařilo se načíst soubor s adresami.", null, e, Level.WARNING, false);
1.256 + } finally {
1.257 + setCursor(Cursor.getDefaultCursor());
1.258 + }
1.259 +
1.260 + }
1.261 + }//GEN-LAST:event_otevritActionPerformed
1.262 +
1.263 + // Variables declaration - do not modify//GEN-BEGIN:variables
1.264 + private javax.swing.JScrollPane jScrollPane1;
1.265 + private javax.swing.JButton odebrat;
1.266 + private javax.swing.JButton otevrit;
1.267 + private javax.swing.JButton pridat;
1.268 + private cz.frantovo.gui.tabulky.JTable tabulka;
1.269 + private javax.swing.JButton ulozit;
1.270 + // End of variables declaration//GEN-END:variables
1.271 + private class ModelTabulky implements TableModel {
1.272 +
1.273 + private String[] sloupecky = {"Jméno", "e-mail"};
1.274 + private ArrayList<InternetAddressKomu> data = new ArrayList<InternetAddressKomu>();
1.275 + private HashSet<TableModelListener> posluchace = new HashSet<TableModelListener>();
1.276 +
1.277 + public int getRowCount() {
1.278 + return data.size();
1.279 + }
1.280 +
1.281 + public int getColumnCount() {
1.282 + return sloupecky.length;
1.283 + }
1.284 +
1.285 + public String getColumnName(int n) {
1.286 + return sloupecky[n];
1.287 + }
1.288 +
1.289 + public Class<?> getColumnClass(int n) {
1.290 + return String.class;
1.291 + }
1.292 +
1.293 + public boolean isCellEditable(int m, int n) {
1.294 + return true;
1.295 + }
1.296 +
1.297 + public Object getValueAt(int m, int n) {
1.298 + if (n == 0) {
1.299 + return data.get(m).getPersonal();
1.300 + } else if (n == 1) {
1.301 + return data.get(m).getAddress();
1.302 + } else {
1.303 + return null;
1.304 + }
1.305 + }
1.306 +
1.307 + public void setValueAt(Object value, int m, int n) {
1.308 + if (n == 0) {
1.309 + try {
1.310 + data.get(m).setPersonal(String.valueOf(value.toString()));
1.311 + } catch (Exception ex) {
1.312 + log.log(Level.SEVERE, "ModelTabulky.setValueAt(" + m + ", " + n + ")", ex);
1.313 + }
1.314 + } else if (n == 1) {
1.315 + data.get(m).setAddress(String.valueOf(value.toString()));
1.316 + }
1.317 + }
1.318 +
1.319 + public void addTableModelListener(TableModelListener l) {
1.320 + posluchace.add(l);
1.321 + }
1.322 +
1.323 + public void removeTableModelListener(TableModelListener l) {
1.324 + posluchace.remove(l);
1.325 + }
1.326 +
1.327 + public void pridejRadek() {
1.328 + data.add(new InternetAddressKomu());
1.329 +
1.330 + upozorniPosluchace();
1.331 + }
1.332 +
1.333 + public void odeberRadek(int m) {
1.334 + data.remove(m);
1.335 + upozorniPosluchace();
1.336 + }
1.337 +
1.338 + private void upozorniPosluchace() {
1.339 + for (TableModelListener p : posluchace) {
1.340 + p.tableChanged(new TableModelEvent(this));
1.341 + }
1.342 + }
1.343 + }
1.344 +}