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