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