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