java/SuperPostak/src/cz/frantovo/superPostak/SuperPostak.java
changeset 0 e76872ad5226
child 3 03d27d3b3f7b
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/java/SuperPostak/src/cz/frantovo/superPostak/SuperPostak.java	Sun Nov 23 22:19:20 2008 +0100
     1.3 @@ -0,0 +1,1241 @@
     1.4 +package cz.frantovo.superPostak;
     1.5 +
     1.6 +import cz.frantovo.postak.HromadnaZprava;
     1.7 +import cz.frantovo.postak.InternetAddressKomu;
     1.8 +import cz.frantovo.postak.Nastaveni;
     1.9 +import cz.frantovo.postak.Postak;
    1.10 +import java.awt.CardLayout;
    1.11 +import java.awt.Component;
    1.12 +import java.awt.Cursor;
    1.13 +import java.awt.Dialog.ModalityType;
    1.14 +import java.awt.KeyboardFocusManager;
    1.15 +import java.beans.XMLDecoder;
    1.16 +import java.beans.XMLEncoder;
    1.17 +import java.io.BufferedInputStream;
    1.18 +import java.io.BufferedOutputStream;
    1.19 +import java.io.File;
    1.20 +import java.io.FileInputStream;
    1.21 +import java.io.FileNotFoundException;
    1.22 +import java.io.FileOutputStream;
    1.23 +import java.io.IOException;
    1.24 +import java.io.UnsupportedEncodingException;
    1.25 +import java.sql.SQLException;
    1.26 +import java.util.ArrayList;
    1.27 +import java.util.Collection;
    1.28 +import java.util.logging.Level;
    1.29 +import java.util.logging.Logger;
    1.30 +import java.util.zip.GZIPInputStream;
    1.31 +import java.util.zip.GZIPOutputStream;
    1.32 +import javax.mail.MessagingException;
    1.33 +import javax.mail.internet.InternetAddress;
    1.34 +import javax.swing.JComponent;
    1.35 +import javax.swing.JDialog;
    1.36 +import javax.swing.JOptionPane;
    1.37 +import javax.swing.JTextArea;
    1.38 +import javax.swing.LookAndFeel;
    1.39 +import javax.swing.UIManager;
    1.40 +import javax.swing.UnsupportedLookAndFeelException;
    1.41 +import org.jdesktop.swingx.JXErrorPane;
    1.42 +import org.jdesktop.swingx.JXTaskPaneContainer;
    1.43 +import org.jdesktop.swingx.error.ErrorInfo;
    1.44 +import org.jvnet.substance.skin.SubstanceBusinessBlueSteelLookAndFeel;
    1.45 +
    1.46 +/**
    1.47 + *
    1.48 + * @author  fiki
    1.49 + */
    1.50 +public class SuperPostak extends javax.swing.JFrame {
    1.51 +
    1.52 +    /** Soubor, kde je uložené nastavení */
    1.53 +    private static final String NASTAVENI_SOUBOR = "Nastaveni.xml.gz";
    1.54 +    private static final String CERTIFIKATY_SOUBOR = "DuveryhodneCertifikaty.keystore";
    1.55 +    private static final String NASTAVENI_SLOZKA = ".SuperPostak";
    1.56 +    private static final String DOMACI_ADRESAR = System.getProperty("user.home");
    1.57 +    private static Logger log = Logger.getLogger(SuperPostak.class.getName());
    1.58 +    private Nastaveni nastaveni = new Nastaveni();
    1.59 +    private Postak postak = new Postak(nastaveni);
    1.60 +
    1.61 +    /**
    1.62 +     * Creates new form SuperPostak
    1.63 +     * @param ladit předvyplní testovací hodnoty - zprávu
    1.64 +     * @param exit při zavření okna ukončí program     
    1.65 +     */
    1.66 +    public SuperPostak(boolean ladit, boolean exit) {
    1.67 +        log.log(Level.WARNING, "Program byl spuštěn.");
    1.68 +        nactiOvladaceJDBC();
    1.69 +        vytvorSlozkuProgramu();
    1.70 +        initComponents();
    1.71 +
    1.72 +        nactiNastaveni();
    1.73 +        ulozNastaveni();
    1.74 +        nastaveni.setCestaKCertifikatum(getCestaKCertifikatum());
    1.75 +
    1.76 +        inicializujCardLayout();
    1.77 +        setLocationRelativeTo(null);
    1.78 +
    1.79 +        /** Vyřešíme problém TAB vs. Focus */
    1.80 +        vyresitTabFocusProblem(vstupSQL);
    1.81 +        vyresitTabFocusProblem(vstupZprava);
    1.82 +
    1.83 +        /** Ladicí hodnoty */
    1.84 +        if (ladit) {
    1.85 +            nastavLadiciHodnoty();
    1.86 +        }
    1.87 +        
    1.88 +        if (exit) {
    1.89 +            setDefaultCloseOperation(EXIT_ON_CLOSE);
    1.90 +        }
    1.91 +
    1.92 +
    1.93 +    }
    1.94 +
    1.95 +    private void inicializujCardLayout() {
    1.96 +        panelDatabaze.setName("panelDatabaze");
    1.97 +        panelOdeslat.setName("panelOdeslat");
    1.98 +        panelPrijemci.setName("panelPrijemci");
    1.99 +        panelServer.setName("panelServer");
   1.100 +        panelVychoziPrijemci.setName("panelVychoziPrijemci");
   1.101 +        panelZprava.setName("panelZprava");
   1.102 +
   1.103 +        panel.add(panelDatabaze, panelDatabaze.getName());
   1.104 +        panel.add(panelOdeslat, panelOdeslat.getName());
   1.105 +        panel.add(panelPrijemci, panelPrijemci.getName());
   1.106 +        panel.add(panelServer, panelServer.getName());
   1.107 +        panel.add(panelVychoziPrijemci, panelVychoziPrijemci.getName());
   1.108 +        panel.add(panelZprava, panelZprava.getName());
   1.109 +
   1.110 +        setPanel(panelZprava);
   1.111 +        pack();
   1.112 +    }
   1.113 +
   1.114 +    /**
   1.115 +     * Vyplní formuláře (odesílatel, předmět, zpráva, příjemci...) výchozími hodnotami,
   1.116 +     * aby se dal program testovat jedním kliknutím.
   1.117 +     */
   1.118 +    private void nastavLadiciHodnoty() {
   1.119 +        try {
   1.120 +            vstupAdresaOdesilatele.setText("SuperPostak@frantovo.cz");
   1.121 +            vstupJmenoOdesilatele.setText("SuperPošťák");
   1.122 +            vstupPredmet.setText("Zkušební zpráva od SuperPošťáka");
   1.123 +            vstupZprava.setText("Toto je obyčejná zkušební zpráva v češtině :-)");
   1.124 +            ArrayList<InternetAddressKomu> adresy = new ArrayList<InternetAddressKomu>();
   1.125 +            adresy.add(new InternetAddressKomu("SuperPostak@frantovo.cz", "SuperPošťák"));
   1.126 +            prijemciZkusebni.setAdresy(adresy);
   1.127 +        } catch (UnsupportedEncodingException e) {
   1.128 +            log.log(Level.SEVERE, null, e);
   1.129 +        }
   1.130 +    }
   1.131 +
   1.132 +    /**
   1.133 +     * Pokusíme se načíst ovladače pro různé DB a výsledek zapíšeme do logu.
   1.134 +     * Další ovladače je možné přidat pomocí manifestu v příslušných knihovnách.
   1.135 +     * viz http://www.sweb.cz/pichlik/archive/2006_08_06_archive.html#115502885631518161
   1.136 +     */
   1.137 +    private void nactiOvladaceJDBC() {
   1.138 +        nactiOvladacJDBC("org.postgresql.Driver", "PostgreSQL");
   1.139 +        nactiOvladacJDBC("com.mysql.jdbc.Driver", "MySQL");
   1.140 +        nactiOvladacJDBC("net.sourceforge.jtds.jdbc.Driver", "jTDS Sybase a MS SQL");
   1.141 +        nactiOvladacJDBC("com.sybase.jdbc2.jdbc.SybDriver", "Sybase.com");
   1.142 +    }
   1.143 +
   1.144 +    /**
   1.145 +     * @param trida ovladač databáze, který se má načíst
   1.146 +     * @param jmeno název databáze     
   1.147 +     */
   1.148 +    private void nactiOvladacJDBC(String trida, String jmeno) {
   1.149 +        try {
   1.150 +            Class.forName(trida);
   1.151 +            log.log(Level.INFO, "JDBC ovladač pro " + jmeno + " byl úspěšně načten.");
   1.152 +        } catch (ClassNotFoundException e) {
   1.153 +            log.log(Level.INFO, "JDBC ovladač pro " + jmeno + " se nepodařilo načíst.");
   1.154 +        }
   1.155 +    }
   1.156 +
   1.157 +    /** Vrací plnou cestu k souboru s nastavením */
   1.158 +    protected static String getCestaKCertifikatum() {
   1.159 +        return getCestaKeSlozceProgramu() + CERTIFIKATY_SOUBOR;
   1.160 +    }
   1.161 +
   1.162 +    /** Vrací plnou cestu k souboru s nastavením */
   1.163 +    protected static String getCestaKNastaveni() {
   1.164 +        return getCestaKeSlozceProgramu() + NASTAVENI_SOUBOR;
   1.165 +    }
   1.166 +
   1.167 +    /** Vrací plnou cestu ke složce programu (nastavení, certifikáty a logy) */
   1.168 +    protected static String getCestaKeSlozceProgramu() {
   1.169 +        return DOMACI_ADRESAR + File.separator + NASTAVENI_SLOZKA + File.separator;
   1.170 +    }
   1.171 +
   1.172 +    /** Načte nastavení ze souboru */
   1.173 +    private void nactiNastaveni() {
   1.174 +        try {
   1.175 +            XMLDecoder d = new XMLDecoder(new BufferedInputStream(new GZIPInputStream(new FileInputStream(getCestaKNastaveni()))));
   1.176 +            Object xmlObjekt = d.readObject();
   1.177 +            d.close();
   1.178 +
   1.179 +            if (xmlObjekt instanceof Nastaveni) {
   1.180 +                nastaveni = (Nastaveni) xmlObjekt;
   1.181 +            } else {
   1.182 +                nastaveni = new Nastaveni();
   1.183 +                log.log(Level.SEVERE, "Nepodařilo se načíst nastavení: není instancí");
   1.184 +            }
   1.185 +
   1.186 +            nactiNastaveniGUI();
   1.187 +
   1.188 +            log.log(Level.INFO, "Nastavení bylo načteno.");
   1.189 +        } catch (FileNotFoundException ex) {
   1.190 +            log.log(Level.SEVERE, "Nepodařilo se načíst nastavení: soubor nenalezen", ex);
   1.191 +        } catch (IOException ex) {
   1.192 +            log.log(Level.SEVERE, "Nastavení se nepodařilo načíst: I/O.", ex);
   1.193 +        }
   1.194 +    }
   1.195 +
   1.196 +    /** Vytvoří (pokud neexistuje) v domovském adresáři složku, kam se ukládá nastavení a případně logy */
   1.197 +    private static boolean vytvorSlozkuProgramu() {
   1.198 +        if (new File(getCestaKeSlozceProgramu()).mkdirs()) {
   1.199 +            log.log(Level.INFO, "Složka pro nastavení programu byla vytvořena: " + getCestaKeSlozceProgramu());
   1.200 +            return true;
   1.201 +        } else {
   1.202 +            return false;
   1.203 +        }
   1.204 +    }
   1.205 +
   1.206 +    /** Uloží nastavení do souboru */
   1.207 +    private void ulozNastaveni() {
   1.208 +        try {
   1.209 +            ulozNastaveniGUI();
   1.210 +
   1.211 +            vytvorSlozkuProgramu();
   1.212 +
   1.213 +            XMLEncoder e = new XMLEncoder(new BufferedOutputStream(new GZIPOutputStream(new FileOutputStream(getCestaKNastaveni()))));
   1.214 +            e.writeObject(nastaveni);
   1.215 +            e.close();
   1.216 +            log.log(Level.INFO, "Nastavení bylo uloženo.");
   1.217 +        } catch (FileNotFoundException ex) {
   1.218 +            log.log(Level.SEVERE, "Nastavení se nepodařilo uložit: soubor nenalezen.", ex);
   1.219 +        } catch (IOException ex) {
   1.220 +            log.log(Level.SEVERE, "Nastavení se nepodařilo uložit: I/O.", ex);
   1.221 +        }
   1.222 +    }
   1.223 +
   1.224 +    /** Posbírá zadané hodnoty z GUI a uloží je do objektu nastaveni */
   1.225 +    private void ulozNastaveniGUI() {
   1.226 +        nastaveni.setDatabaze(vstupDatabaze.getText());
   1.227 +        nastaveni.setDbHeslo(vstupDBheslo.getPassword());
   1.228 +        nastaveni.setDbJmeno(vstupDBjmeno.getText());
   1.229 +        nastaveni.setLimitZprav((Integer) vstupSMTPlimitPrijemcu.getValue());
   1.230 +        nastaveni.setPostovniHeslo(vstupSMTPheslo.getPassword());
   1.231 +        nastaveni.setPostovniJmeno(vstupSMTPjmeno.getText());
   1.232 +        nastaveni.setPostovniPort((Integer) vstupSMTPport.getValue());
   1.233 +        nastaveni.setPostovniServer(vstupSMTPserver.getText());
   1.234 +        nastaveni.setVychoziPrijemci(prijemciVychozi.getAdresy());
   1.235 +    }
   1.236 +
   1.237 +    /** Aktualizuje GUI formuláře hodnotami z objektu nastaveni */
   1.238 +    private void nactiNastaveniGUI() {
   1.239 +        vstupDatabaze.setText(nastaveni.getDatabaze());
   1.240 +        if (nastaveni.getDbHeslo() != null) {
   1.241 +            vstupDBheslo.setText(String.valueOf(nastaveni.getDbHeslo()));
   1.242 +        }
   1.243 +        vstupDBjmeno.setText(nastaveni.getDbJmeno());
   1.244 +        vstupSMTPlimitPrijemcu.setValue(nastaveni.getLimitZprav());
   1.245 +        if (nastaveni.getPostovniHeslo() != null) {
   1.246 +            vstupSMTPheslo.setText(String.valueOf(nastaveni.getPostovniHeslo()));
   1.247 +        }
   1.248 +        vstupSMTPjmeno.setText(nastaveni.getPostovniJmeno());
   1.249 +        vstupSMTPport.setValue(nastaveni.getPostovniPort());
   1.250 +        vstupSMTPserver.setText(nastaveni.getPostovniServer());
   1.251 +        prijemciVychozi.setAdresy(nastaveni.getVychoziPrijemci());
   1.252 +    }
   1.253 +
   1.254 +    protected static void zobrazChybovyDialog(Component vlastnik, String strucnaZprava, Throwable vyjimka, Level zavaznost, boolean logovat) {
   1.255 +        zobrazChybovyDialog(vlastnik, "Chyba", strucnaZprava, null, vyjimka, zavaznost, logovat);
   1.256 +    }
   1.257 +
   1.258 +    protected static void zobrazInformacniDialog(Component vlastnik, String nadpis, String text, boolean loguj) {
   1.259 +        JOptionPane.showMessageDialog(vlastnik, text, nadpis, JOptionPane.INFORMATION_MESSAGE);
   1.260 +        if (loguj) {
   1.261 +            log.log(Level.INFO, nadpis + ": " + text);
   1.262 +        }
   1.263 +    }
   1.264 +
   1.265 +    protected static void zobrazChybovyDialog(Component vlastnik, String nadpis, String strucnaZprava, String podrobnaZprava, Throwable vyjimka, Level zavaznost, boolean logovat) {
   1.266 +        if (logovat) {
   1.267 +            log.log(zavaznost, strucnaZprava, vyjimka);
   1.268 +        }
   1.269 +
   1.270 +        JXErrorPane chybovyPanel = new JXErrorPane();
   1.271 +        ErrorInfo chybovaInformace = new ErrorInfo(nadpis, strucnaZprava, podrobnaZprava, null, vyjimka, zavaznost, null);
   1.272 +        chybovyPanel.setErrorInfo(chybovaInformace);
   1.273 +        JDialog dialog = JXErrorPane.createDialog(vlastnik, chybovyPanel);
   1.274 +        dialog.setVisible(true);
   1.275 +    }
   1.276 +
   1.277 +    private void zobrazChybovyDialog(String strucnaZprava, Throwable vyjimka, Level zavaznost, boolean logovat) {
   1.278 +        zobrazChybovyDialog(this, strucnaZprava, vyjimka, zavaznost, logovat);
   1.279 +    }
   1.280 +
   1.281 +    private void zobrazInformacniDialog(String nadpis, String text, boolean loguj) {
   1.282 +        zobrazInformacniDialog(this, nadpis, text, loguj);
   1.283 +    }
   1.284 +
   1.285 +    private void zobrazChybovyDialog(String nadpis, String strucnaZprava, String podrobnaZprava, Throwable vyjimka, Level zavaznost, boolean logovat) {
   1.286 +        zobrazChybovyDialog(this, nadpis, strucnaZprava, podrobnaZprava, vyjimka, zavaznost, logovat);
   1.287 +    }
   1.288 +
   1.289 +    /** This method is called from within the constructor to
   1.290 +     * initialize the form.
   1.291 +     * WARNING: Do NOT modify this code. The content of this method is
   1.292 +     * always regenerated by the Form Editor.
   1.293 +     */
   1.294 +    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
   1.295 +    private void initComponents() {
   1.296 +
   1.297 +        panelDatabaze = new org.jdesktop.swingx.JXPanel();
   1.298 +        jLabel9 = new javax.swing.JLabel();
   1.299 +        vstupDatabaze = new javax.swing.JTextField();
   1.300 +        jLabel10 = new javax.swing.JLabel();
   1.301 +        vstupDBjmeno = new javax.swing.JTextField();
   1.302 +        vstupDBheslo = new javax.swing.JPasswordField();
   1.303 +        jLabel11 = new javax.swing.JLabel();
   1.304 +        vyzkousetPripojeniTlacitko = new javax.swing.JButton();
   1.305 +        vystupDBzprava = new javax.swing.JLabel();
   1.306 +        panelOdeslat = new org.jdesktop.swingx.JXPanel();
   1.307 +        jPanel1 = new javax.swing.JPanel();
   1.308 +        rozeslatZkusebniTlacitko = new javax.swing.JButton();
   1.309 +        rozeslatHromadnouZpravuTlacitko = new javax.swing.JButton();
   1.310 +        zobrazitVsechnyPrijemceTlacitko = new javax.swing.JButton();
   1.311 +        prijemciZkusebni = new cz.frantovo.superPostak.PanelPrijemcu();
   1.312 +        jSeparator2 = new javax.swing.JSeparator();
   1.313 +        jLabel14 = new javax.swing.JLabel();
   1.314 +        panelPrijemci = new org.jdesktop.swingx.JXPanel();
   1.315 +        jLabel13 = new javax.swing.JLabel();
   1.316 +        jScrollPane3 = new javax.swing.JScrollPane();
   1.317 +        vstupSQL = new javax.swing.JTextArea();
   1.318 +        vyzkousetSQLTlacitko = new javax.swing.JButton();
   1.319 +        vystupSQLZprava = new javax.swing.JLabel();
   1.320 +        prijemciDodatecni = new cz.frantovo.superPostak.PanelPrijemcu();
   1.321 +        jSeparator1 = new javax.swing.JSeparator();
   1.322 +        jLabel16 = new javax.swing.JLabel();
   1.323 +        zobrazitSQLPrijemceTlacitko = new javax.swing.JButton();
   1.324 +        panelServer = new org.jdesktop.swingx.JXPanel();
   1.325 +        jLabel4 = new javax.swing.JLabel();
   1.326 +        jLabel5 = new javax.swing.JLabel();
   1.327 +        vstupSMTPserver = new javax.swing.JTextField();
   1.328 +        vstupSMTPport = new javax.swing.JSpinner();
   1.329 +        napovedaSMTPscroll = new javax.swing.JScrollPane();
   1.330 +        napovedaSMTP = new javax.swing.JTextArea();
   1.331 +        jLabel6 = new javax.swing.JLabel();
   1.332 +        vstupSMTPjmeno = new javax.swing.JTextField();
   1.333 +        vstupSMTPheslo = new javax.swing.JPasswordField();
   1.334 +        jLabel7 = new javax.swing.JLabel();
   1.335 +        vstupSMTPlimitPrijemcu = new javax.swing.JSpinner();
   1.336 +        jLabel8 = new javax.swing.JLabel();
   1.337 +        panelVychoziPrijemci = new org.jdesktop.swingx.JXPanel();
   1.338 +        prijemciVychozi = new cz.frantovo.superPostak.PanelPrijemcu();
   1.339 +        jLabel12 = new javax.swing.JLabel();
   1.340 +        panelZprava = new org.jdesktop.swingx.JXPanel();
   1.341 +        jLabel1 = new javax.swing.JLabel();
   1.342 +        vstupPredmet = new javax.swing.JTextField();
   1.343 +        jLabel2 = new javax.swing.JLabel();
   1.344 +        vstupJmenoOdesilatele = new javax.swing.JTextField();
   1.345 +        vstupAdresaOdesilatele = new javax.swing.JTextField();
   1.346 +        jScrollPane1 = new javax.swing.JScrollPane();
   1.347 +        vstupZprava = new javax.swing.JTextArea();
   1.348 +        jLabel15 = new javax.swing.JLabel();
   1.349 +        vstupFormatHTML = new javax.swing.JCheckBox();
   1.350 +        odpovedetKomuOdkaz = new org.jdesktop.swingx.JXHyperlink();
   1.351 +        odpovedetKomuDialog = new javax.swing.JDialog();
   1.352 +        jLabel18 = new javax.swing.JLabel();
   1.353 +        jLabel19 = new javax.swing.JLabel();
   1.354 +        jLabel17 = new javax.swing.JLabel();
   1.355 +        odpovedetKomuJmeno = new javax.swing.JTextField();
   1.356 +        odpovedetKomuAdresa = new javax.swing.JTextField();
   1.357 +        odpovedetKomuHotovo = new javax.swing.JButton();
   1.358 +        jXHeader1 = new org.jdesktop.swingx.JXHeader();
   1.359 +        taskPanel = new org.jdesktop.swingx.JXTaskPaneContainer();
   1.360 +        jXTaskPane1 = new org.jdesktop.swingx.JXTaskPane();
   1.361 +        lnText = new org.jdesktop.swingx.JXHyperlink();
   1.362 +        lnPrijemci = new org.jdesktop.swingx.JXHyperlink();
   1.363 +        lnOdeslat = new org.jdesktop.swingx.JXHyperlink();
   1.364 +        jXTaskPane2 = new org.jdesktop.swingx.JXTaskPane();
   1.365 +        lnServer = new org.jdesktop.swingx.JXHyperlink();
   1.366 +        lnDatabaze = new org.jdesktop.swingx.JXHyperlink();
   1.367 +        lnVychoziPrijemci = new org.jdesktop.swingx.JXHyperlink();
   1.368 +        panel = new org.jdesktop.swingx.JXPanel();
   1.369 +
   1.370 +        jLabel9.setText("Databáze");
   1.371 +
   1.372 +        jLabel10.setText("Jméno");
   1.373 +
   1.374 +        jLabel11.setText("Heslo");
   1.375 +
   1.376 +        vyzkousetPripojeniTlacitko.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/frantovo/superPostak/obrazky/fork.png"))); // NOI18N
   1.377 +        vyzkousetPripojeniTlacitko.setMnemonic('y');
   1.378 +        vyzkousetPripojeniTlacitko.setText("Vyzkoušet spojení");
   1.379 +        vyzkousetPripojeniTlacitko.addActionListener(new java.awt.event.ActionListener() {
   1.380 +            public void actionPerformed(java.awt.event.ActionEvent evt) {
   1.381 +                vyzkousetPripojeniTlacitkoActionPerformed(evt);
   1.382 +            }
   1.383 +        });
   1.384 +
   1.385 +        vystupDBzprava.setText(" ");
   1.386 +
   1.387 +        javax.swing.GroupLayout panelDatabazeLayout = new javax.swing.GroupLayout(panelDatabaze);
   1.388 +        panelDatabaze.setLayout(panelDatabazeLayout);
   1.389 +        panelDatabazeLayout.setHorizontalGroup(
   1.390 +            panelDatabazeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
   1.391 +            .addGroup(panelDatabazeLayout.createSequentialGroup()
   1.392 +                .addContainerGap()
   1.393 +                .addGroup(panelDatabazeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
   1.394 +                    .addGroup(panelDatabazeLayout.createSequentialGroup()
   1.395 +                        .addGroup(panelDatabazeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
   1.396 +                            .addComponent(jLabel9)
   1.397 +                            .addComponent(jLabel10)
   1.398 +                            .addComponent(jLabel11))
   1.399 +                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
   1.400 +                        .addGroup(panelDatabazeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
   1.401 +                            .addComponent(vstupDatabaze, javax.swing.GroupLayout.DEFAULT_SIZE, 257, Short.MAX_VALUE)
   1.402 +                            .addComponent(vstupDBjmeno, javax.swing.GroupLayout.DEFAULT_SIZE, 257, Short.MAX_VALUE)
   1.403 +                            .addGroup(panelDatabazeLayout.createSequentialGroup()
   1.404 +                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
   1.405 +                                .addComponent(vstupDBheslo, javax.swing.GroupLayout.DEFAULT_SIZE, 257, Short.MAX_VALUE))))
   1.406 +                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelDatabazeLayout.createSequentialGroup()
   1.407 +                        .addComponent(vystupDBzprava, javax.swing.GroupLayout.DEFAULT_SIZE, 155, Short.MAX_VALUE)
   1.408 +                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
   1.409 +                        .addComponent(vyzkousetPripojeniTlacitko)))
   1.410 +                .addContainerGap())
   1.411 +        );
   1.412 +        panelDatabazeLayout.setVerticalGroup(
   1.413 +            panelDatabazeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
   1.414 +            .addGroup(panelDatabazeLayout.createSequentialGroup()
   1.415 +                .addContainerGap()
   1.416 +                .addGroup(panelDatabazeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
   1.417 +                    .addComponent(jLabel9)
   1.418 +                    .addComponent(vstupDatabaze, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
   1.419 +                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
   1.420 +                .addGroup(panelDatabazeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
   1.421 +                    .addComponent(jLabel10)
   1.422 +                    .addComponent(vstupDBjmeno, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
   1.423 +                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
   1.424 +                .addGroup(panelDatabazeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
   1.425 +                    .addComponent(jLabel11)
   1.426 +                    .addComponent(vstupDBheslo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
   1.427 +                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
   1.428 +                .addGroup(panelDatabazeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
   1.429 +                    .addComponent(vyzkousetPripojeniTlacitko)
   1.430 +                    .addComponent(vystupDBzprava))
   1.431 +                .addContainerGap(183, Short.MAX_VALUE))
   1.432 +        );
   1.433 +
   1.434 +        rozeslatZkusebniTlacitko.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/frantovo/superPostak/obrazky/apply.png"))); // NOI18N
   1.435 +        rozeslatZkusebniTlacitko.setMnemonic('u');
   1.436 +        rozeslatZkusebniTlacitko.setText("Rozeslat zkušební");
   1.437 +        rozeslatZkusebniTlacitko.addActionListener(new java.awt.event.ActionListener() {
   1.438 +            public void actionPerformed(java.awt.event.ActionEvent evt) {
   1.439 +                rozeslatZkusebniTlacitkoActionPerformed(evt);
   1.440 +            }
   1.441 +        });
   1.442 +
   1.443 +        rozeslatHromadnouZpravuTlacitko.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/frantovo/superPostak/obrazky/adept_commit.png"))); // NOI18N
   1.444 +        rozeslatHromadnouZpravuTlacitko.setMnemonic('h');
   1.445 +        rozeslatHromadnouZpravuTlacitko.setText("Rozeslat hromadnou zprávu");
   1.446 +        rozeslatHromadnouZpravuTlacitko.addActionListener(new java.awt.event.ActionListener() {
   1.447 +            public void actionPerformed(java.awt.event.ActionEvent evt) {
   1.448 +                rozeslatHromadnouZpravuTlacitkoActionPerformed(evt);
   1.449 +            }
   1.450 +        });
   1.451 +
   1.452 +        zobrazitVsechnyPrijemceTlacitko.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/frantovo/superPostak/obrazky/zobrazit_adresy.png"))); // NOI18N
   1.453 +        zobrazitVsechnyPrijemceTlacitko.setToolTipText("<html>\nZobrazí seznam všech příjemcům, kterým bude odeslána zpráva.<br/>\n(Při velkých počtech záznamů může být tato operace náročná.)\n</html>");
   1.454 +        zobrazitVsechnyPrijemceTlacitko.addActionListener(new java.awt.event.ActionListener() {
   1.455 +            public void actionPerformed(java.awt.event.ActionEvent evt) {
   1.456 +                zobrazitVsechnyPrijemceTlacitkoActionPerformed(evt);
   1.457 +            }
   1.458 +        });
   1.459 +
   1.460 +        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
   1.461 +        jPanel1.setLayout(jPanel1Layout);
   1.462 +        jPanel1Layout.setHorizontalGroup(
   1.463 +            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
   1.464 +            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
   1.465 +                .addContainerGap(106, Short.MAX_VALUE)
   1.466 +                .addComponent(rozeslatZkusebniTlacitko)
   1.467 +                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
   1.468 +                .addComponent(rozeslatHromadnouZpravuTlacitko)
   1.469 +                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
   1.470 +                .addComponent(zobrazitVsechnyPrijemceTlacitko)
   1.471 +                .addContainerGap())
   1.472 +        );
   1.473 +        jPanel1Layout.setVerticalGroup(
   1.474 +            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
   1.475 +            .addGroup(jPanel1Layout.createSequentialGroup()
   1.476 +                .addContainerGap()
   1.477 +                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
   1.478 +                    .addComponent(rozeslatHromadnouZpravuTlacitko)
   1.479 +                    .addComponent(zobrazitVsechnyPrijemceTlacitko)
   1.480 +                    .addComponent(rozeslatZkusebniTlacitko))
   1.481 +                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
   1.482 +        );
   1.483 +
   1.484 +        jLabel14.setText("Zkušební příjemci");
   1.485 +
   1.486 +        javax.swing.GroupLayout panelOdeslatLayout = new javax.swing.GroupLayout(panelOdeslat);
   1.487 +        panelOdeslat.setLayout(panelOdeslatLayout);
   1.488 +        panelOdeslatLayout.setHorizontalGroup(
   1.489 +            panelOdeslatLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
   1.490 +            .addGroup(panelOdeslatLayout.createSequentialGroup()
   1.491 +                .addContainerGap()
   1.492 +                .addGroup(panelOdeslatLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
   1.493 +                    .addComponent(prijemciZkusebni, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 535, Short.MAX_VALUE)
   1.494 +                    .addComponent(jSeparator2, javax.swing.GroupLayout.DEFAULT_SIZE, 535, Short.MAX_VALUE)
   1.495 +                    .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
   1.496 +                    .addComponent(jLabel14))
   1.497 +                .addContainerGap())
   1.498 +        );
   1.499 +        panelOdeslatLayout.setVerticalGroup(
   1.500 +            panelOdeslatLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
   1.501 +            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelOdeslatLayout.createSequentialGroup()
   1.502 +                .addContainerGap()
   1.503 +                .addComponent(jLabel14)
   1.504 +                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
   1.505 +                .addComponent(prijemciZkusebni, javax.swing.GroupLayout.DEFAULT_SIZE, 153, Short.MAX_VALUE)
   1.506 +                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
   1.507 +                .addComponent(jSeparator2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
   1.508 +                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
   1.509 +                .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
   1.510 +                .addContainerGap())
   1.511 +        );
   1.512 +
   1.513 +        jLabel13.setText("SQL dotaz");
   1.514 +
   1.515 +        vstupSQL.setColumns(20);
   1.516 +        vstupSQL.setRows(5);
   1.517 +        jScrollPane3.setViewportView(vstupSQL);
   1.518 +
   1.519 +        vyzkousetSQLTlacitko.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/frantovo/superPostak/obrazky/fork.png"))); // NOI18N
   1.520 +        vyzkousetSQLTlacitko.setMnemonic('y');
   1.521 +        vyzkousetSQLTlacitko.setText("Vyzkoušet");
   1.522 +        vyzkousetSQLTlacitko.addActionListener(new java.awt.event.ActionListener() {
   1.523 +            public void actionPerformed(java.awt.event.ActionEvent evt) {
   1.524 +                vyzkousetSQLTlacitkoActionPerformed(evt);
   1.525 +            }
   1.526 +        });
   1.527 +
   1.528 +        vystupSQLZprava.setText(" ");
   1.529 +
   1.530 +        prijemciDodatecni.setToolTipText("Zde můžete dopnit další přijemce.");
   1.531 +
   1.532 +        jLabel16.setText("Dodateční příjemci:");
   1.533 +
   1.534 +        zobrazitSQLPrijemceTlacitko.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/frantovo/superPostak/obrazky/zobrazit_adresy.png"))); // NOI18N
   1.535 +        zobrazitSQLPrijemceTlacitko.setToolTipText("<html>\nZobrazí seznam adres načtených z databáze.<br/>\n(Při velkých počtech záznamů může být tato operace náročná.)\n</html>");
   1.536 +        zobrazitSQLPrijemceTlacitko.addActionListener(new java.awt.event.ActionListener() {
   1.537 +            public void actionPerformed(java.awt.event.ActionEvent evt) {
   1.538 +                zobrazitSQLPrijemceTlacitkoActionPerformed(evt);
   1.539 +            }
   1.540 +        });
   1.541 +
   1.542 +        javax.swing.GroupLayout panelPrijemciLayout = new javax.swing.GroupLayout(panelPrijemci);
   1.543 +        panelPrijemci.setLayout(panelPrijemciLayout);
   1.544 +        panelPrijemciLayout.setHorizontalGroup(
   1.545 +            panelPrijemciLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
   1.546 +            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelPrijemciLayout.createSequentialGroup()
   1.547 +                .addContainerGap()
   1.548 +                .addGroup(panelPrijemciLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
   1.549 +                    .addComponent(prijemciDodatecni, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 344, Short.MAX_VALUE)
   1.550 +                    .addComponent(jSeparator1, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 344, Short.MAX_VALUE)
   1.551 +                    .addComponent(jScrollPane3, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 344, Short.MAX_VALUE)
   1.552 +                    .addComponent(jLabel13, javax.swing.GroupLayout.Alignment.LEADING)
   1.553 +                    .addGroup(panelPrijemciLayout.createSequentialGroup()
   1.554 +                        .addComponent(vystupSQLZprava, javax.swing.GroupLayout.DEFAULT_SIZE, 52, Short.MAX_VALUE)
   1.555 +                        .addGap(127, 127, 127)
   1.556 +                        .addComponent(vyzkousetSQLTlacitko)
   1.557 +                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
   1.558 +                        .addComponent(zobrazitSQLPrijemceTlacitko))
   1.559 +                    .addComponent(jLabel16, javax.swing.GroupLayout.Alignment.LEADING))
   1.560 +                .addContainerGap())
   1.561 +        );
   1.562 +        panelPrijemciLayout.setVerticalGroup(
   1.563 +            panelPrijemciLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
   1.564 +            .addGroup(panelPrijemciLayout.createSequentialGroup()
   1.565 +                .addContainerGap()
   1.566 +                .addComponent(jLabel13)
   1.567 +                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
   1.568 +                .addComponent(jScrollPane3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
   1.569 +                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
   1.570 +                .addGroup(panelPrijemciLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
   1.571 +                    .addComponent(vystupSQLZprava, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE)
   1.572 +                    .addComponent(zobrazitSQLPrijemceTlacitko)
   1.573 +                    .addComponent(vyzkousetSQLTlacitko))
   1.574 +                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
   1.575 +                .addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, 10, javax.swing.GroupLayout.PREFERRED_SIZE)
   1.576 +                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
   1.577 +                .addComponent(jLabel16)
   1.578 +                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
   1.579 +                .addComponent(prijemciDodatecni, javax.swing.GroupLayout.DEFAULT_SIZE, 200, Short.MAX_VALUE)
   1.580 +                .addContainerGap())
   1.581 +        );
   1.582 +
   1.583 +        jLabel4.setText("SMTP server");
   1.584 +
   1.585 +        jLabel5.setText("Port");
   1.586 +
   1.587 +        vstupSMTPserver.setText("localhost");
   1.588 +
   1.589 +        vstupSMTPport.setValue(25);
   1.590 +
   1.591 +        napovedaSMTP.setColumns(20);
   1.592 +        napovedaSMTP.setEditable(false);
   1.593 +        napovedaSMTP.setLineWrap(true);
   1.594 +        napovedaSMTP.setRows(5);
   1.595 +        napovedaSMTP.setText("Tip: některé SMTP servery mají omezený seznam počítačů, ze kterých přijímají poštu");
   1.596 +        napovedaSMTP.setWrapStyleWord(true);
   1.597 +        napovedaSMTPscroll.setViewportView(napovedaSMTP);
   1.598 +
   1.599 +        jLabel6.setText("Jméno");
   1.600 +
   1.601 +        jLabel7.setText("Heslo");
   1.602 +
   1.603 +        vstupSMTPlimitPrijemcu.setValue(1000);
   1.604 +
   1.605 +        jLabel8.setText("Limit příjemců");
   1.606 +
   1.607 +        javax.swing.GroupLayout panelServerLayout = new javax.swing.GroupLayout(panelServer);
   1.608 +        panelServer.setLayout(panelServerLayout);
   1.609 +        panelServerLayout.setHorizontalGroup(
   1.610 +            panelServerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
   1.611 +            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelServerLayout.createSequentialGroup()
   1.612 +                .addContainerGap()
   1.613 +                .addGroup(panelServerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
   1.614 +                    .addComponent(napovedaSMTPscroll, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 318, Short.MAX_VALUE)
   1.615 +                    .addGroup(panelServerLayout.createSequentialGroup()
   1.616 +                        .addGroup(panelServerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
   1.617 +                            .addComponent(jLabel4)
   1.618 +                            .addComponent(jLabel6)
   1.619 +                            .addComponent(jLabel5)
   1.620 +                            .addComponent(jLabel7)
   1.621 +                            .addComponent(jLabel8))
   1.622 +                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
   1.623 +                        .addGroup(panelServerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
   1.624 +                            .addComponent(vstupSMTPserver, javax.swing.GroupLayout.DEFAULT_SIZE, 230, Short.MAX_VALUE)
   1.625 +                            .addComponent(vstupSMTPport, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 230, Short.MAX_VALUE)
   1.626 +                            .addComponent(vstupSMTPjmeno, javax.swing.GroupLayout.DEFAULT_SIZE, 230, Short.MAX_VALUE)
   1.627 +                            .addComponent(vstupSMTPheslo, javax.swing.GroupLayout.DEFAULT_SIZE, 230, Short.MAX_VALUE)
   1.628 +                            .addComponent(vstupSMTPlimitPrijemcu, javax.swing.GroupLayout.DEFAULT_SIZE, 230, Short.MAX_VALUE))))
   1.629 +                .addContainerGap())
   1.630 +        );
   1.631 +        panelServerLayout.setVerticalGroup(
   1.632 +            panelServerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
   1.633 +            .addGroup(panelServerLayout.createSequentialGroup()
   1.634 +                .addContainerGap()
   1.635 +                .addGroup(panelServerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
   1.636 +                    .addComponent(jLabel4)
   1.637 +                    .addComponent(vstupSMTPserver, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
   1.638 +                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
   1.639 +                .addGroup(panelServerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
   1.640 +                    .addComponent(vstupSMTPport, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
   1.641 +                    .addComponent(jLabel5))
   1.642 +                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
   1.643 +                .addGroup(panelServerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
   1.644 +                    .addComponent(jLabel6)
   1.645 +                    .addComponent(vstupSMTPjmeno, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
   1.646 +                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
   1.647 +                .addGroup(panelServerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
   1.648 +                    .addComponent(vstupSMTPheslo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
   1.649 +                    .addComponent(jLabel7))
   1.650 +                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
   1.651 +                .addGroup(panelServerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
   1.652 +                    .addComponent(vstupSMTPlimitPrijemcu, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
   1.653 +                    .addComponent(jLabel8))
   1.654 +                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
   1.655 +                .addComponent(napovedaSMTPscroll, javax.swing.GroupLayout.DEFAULT_SIZE, 145, Short.MAX_VALUE)
   1.656 +                .addContainerGap())
   1.657 +        );
   1.658 +
   1.659 +        jLabel12.setText("Těmto lidem přijde hromadný e-mail vždy (netýká se zkušebního rozeslání zprávy).");
   1.660 +
   1.661 +        javax.swing.GroupLayout panelVychoziPrijemciLayout = new javax.swing.GroupLayout(panelVychoziPrijemci);
   1.662 +        panelVychoziPrijemci.setLayout(panelVychoziPrijemciLayout);
   1.663 +        panelVychoziPrijemciLayout.setHorizontalGroup(
   1.664 +            panelVychoziPrijemciLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
   1.665 +            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelVychoziPrijemciLayout.createSequentialGroup()
   1.666 +                .addContainerGap()
   1.667 +                .addGroup(panelVychoziPrijemciLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
   1.668 +                    .addComponent(prijemciVychozi, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 514, Short.MAX_VALUE)
   1.669 +                    .addComponent(jLabel12, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 514, Short.MAX_VALUE))
   1.670 +                .addContainerGap())
   1.671 +        );
   1.672 +        panelVychoziPrijemciLayout.setVerticalGroup(
   1.673 +            panelVychoziPrijemciLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
   1.674 +            .addGroup(panelVychoziPrijemciLayout.createSequentialGroup()
   1.675 +                .addContainerGap()
   1.676 +                .addComponent(jLabel12)
   1.677 +                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
   1.678 +                .addComponent(prijemciVychozi, javax.swing.GroupLayout.DEFAULT_SIZE, 261, Short.MAX_VALUE)
   1.679 +                .addContainerGap())
   1.680 +        );
   1.681 +
   1.682 +        jLabel1.setLabelFor(vstupPredmet);
   1.683 +        jLabel1.setText("Předmět");
   1.684 +
   1.685 +        vstupPredmet.addActionListener(new java.awt.event.ActionListener() {
   1.686 +            public void actionPerformed(java.awt.event.ActionEvent evt) {
   1.687 +                vstupPredmetActionPerformed(evt);
   1.688 +            }
   1.689 +        });
   1.690 +
   1.691 +        jLabel2.setText("Jméno odesílatele");
   1.692 +
   1.693 +        vstupZprava.setColumns(20);
   1.694 +        vstupZprava.setRows(5);
   1.695 +        jScrollPane1.setViewportView(vstupZprava);
   1.696 +
   1.697 +        jLabel15.setText("Formát zprávy");
   1.698 +
   1.699 +        vstupFormatHTML.setMnemonic('h');
   1.700 +        vstupFormatHTML.setText("HTML");
   1.701 +        vstupFormatHTML.setToolTipText("Při nezaškrtnutí se odešle jako prostý text");
   1.702 +
   1.703 +        odpovedetKomuOdkaz.setForeground(javax.swing.UIManager.getDefaults().getColor("windowText"));
   1.704 +        odpovedetKomuOdkaz.setMnemonic('e');
   1.705 +        odpovedetKomuOdkaz.setText("Adresa odesílatele");
   1.706 +        odpovedetKomuOdkaz.setToolTipText("<html><p>Klikněte sem pro nastavení adresy,</p><p>na kterou mají chodit odpovědi</p></html>");
   1.707 +        odpovedetKomuOdkaz.setClickedColor(javax.swing.UIManager.getDefaults().getColor("windowText"));
   1.708 +        odpovedetKomuOdkaz.setUnclickedColor(javax.swing.UIManager.getDefaults().getColor("windowText"));
   1.709 +        odpovedetKomuOdkaz.addActionListener(new java.awt.event.ActionListener() {
   1.710 +            public void actionPerformed(java.awt.event.ActionEvent evt) {
   1.711 +                odpovedetKomuOdkazActionPerformed(evt);
   1.712 +            }
   1.713 +        });
   1.714 +
   1.715 +        javax.swing.GroupLayout panelZpravaLayout = new javax.swing.GroupLayout(panelZprava);
   1.716 +        panelZprava.setLayout(panelZpravaLayout);
   1.717 +        panelZpravaLayout.setHorizontalGroup(
   1.718 +            panelZpravaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
   1.719 +            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelZpravaLayout.createSequentialGroup()
   1.720 +                .addContainerGap()
   1.721 +                .addGroup(panelZpravaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
   1.722 +                    .addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 438, Short.MAX_VALUE)
   1.723 +                    .addGroup(panelZpravaLayout.createSequentialGroup()
   1.724 +                        .addGroup(panelZpravaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
   1.725 +                            .addGroup(panelZpravaLayout.createSequentialGroup()
   1.726 +                                .addGroup(panelZpravaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
   1.727 +                                    .addComponent(jLabel2)
   1.728 +                                    .addComponent(jLabel1))
   1.729 +                                .addGap(17, 17, 17))
   1.730 +                            .addGroup(panelZpravaLayout.createSequentialGroup()
   1.731 +                                .addComponent(odpovedetKomuOdkaz, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
   1.732 +                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)))
   1.733 +                        .addGroup(panelZpravaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
   1.734 +                            .addComponent(vstupJmenoOdesilatele, javax.swing.GroupLayout.DEFAULT_SIZE, 328, Short.MAX_VALUE)
   1.735 +                            .addComponent(vstupAdresaOdesilatele, javax.swing.GroupLayout.DEFAULT_SIZE, 328, Short.MAX_VALUE)
   1.736 +                            .addComponent(vstupPredmet, javax.swing.GroupLayout.DEFAULT_SIZE, 328, Short.MAX_VALUE)))
   1.737 +                    .addGroup(javax.swing.GroupLayout.Alignment.LEADING, panelZpravaLayout.createSequentialGroup()
   1.738 +                        .addComponent(jLabel15)
   1.739 +                        .addGap(33, 33, 33)
   1.740 +                        .addComponent(vstupFormatHTML, javax.swing.GroupLayout.DEFAULT_SIZE, 81, Short.MAX_VALUE)
   1.741 +                        .addGap(247, 247, 247)))
   1.742 +                .addContainerGap())
   1.743 +        );
   1.744 +        panelZpravaLayout.setVerticalGroup(
   1.745 +            panelZpravaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
   1.746 +            .addGroup(panelZpravaLayout.createSequentialGroup()
   1.747 +                .addContainerGap()
   1.748 +                .addGroup(panelZpravaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
   1.749 +                    .addComponent(jLabel1)
   1.750 +                    .addComponent(vstupPredmet, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
   1.751 +                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
   1.752 +                .addGroup(panelZpravaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
   1.753 +                    .addComponent(jLabel2)
   1.754 +                    .addComponent(vstupJmenoOdesilatele, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
   1.755 +                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
   1.756 +                .addGroup(panelZpravaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
   1.757 +                    .addComponent(vstupAdresaOdesilatele, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
   1.758 +                    .addComponent(odpovedetKomuOdkaz, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
   1.759 +                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
   1.760 +                .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 184, Short.MAX_VALUE)
   1.761 +                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
   1.762 +                .addGroup(panelZpravaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
   1.763 +                    .addComponent(jLabel15)
   1.764 +                    .addComponent(vstupFormatHTML))
   1.765 +                .addContainerGap())
   1.766 +        );
   1.767 +
   1.768 +        odpovedetKomuDialog.setTitle("Adresa pro odpovědi");
   1.769 +        odpovedetKomuDialog.setModal(true);
   1.770 +
   1.771 +        jLabel18.setText("Jméno");
   1.772 +
   1.773 +        jLabel19.setText("Adresa");
   1.774 +
   1.775 +        jLabel17.setText("<html>\n<p>Pokud bude příjemce na hromadnou zprávu odpovídat,</p>\n<p>odpověď přijde na tuto adresu.</p>\n<p>Pokud tyto údaje nevyplníte, nebo zadáte chybný e-mail,</p>\n<p>budou odpovědi chodit odesílateli.</p>\n</html>");
   1.776 +
   1.777 +        odpovedetKomuHotovo.setText("Hotovo");
   1.778 +        odpovedetKomuHotovo.addActionListener(new java.awt.event.ActionListener() {
   1.779 +            public void actionPerformed(java.awt.event.ActionEvent evt) {
   1.780 +                odpovedetKomuHotovoActionPerformed(evt);
   1.781 +            }
   1.782 +        });
   1.783 +
   1.784 +        javax.swing.GroupLayout odpovedetKomuDialogLayout = new javax.swing.GroupLayout(odpovedetKomuDialog.getContentPane());
   1.785 +        odpovedetKomuDialog.getContentPane().setLayout(odpovedetKomuDialogLayout);
   1.786 +        odpovedetKomuDialogLayout.setHorizontalGroup(
   1.787 +            odpovedetKomuDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
   1.788 +            .addGroup(odpovedetKomuDialogLayout.createSequentialGroup()
   1.789 +                .addContainerGap()
   1.790 +                .addGroup(odpovedetKomuDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
   1.791 +                    .addGroup(odpovedetKomuDialogLayout.createSequentialGroup()
   1.792 +                        .addGroup(odpovedetKomuDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
   1.793 +                            .addComponent(jLabel19)
   1.794 +                            .addComponent(jLabel18))
   1.795 +                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
   1.796 +                        .addGroup(odpovedetKomuDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
   1.797 +                            .addComponent(odpovedetKomuAdresa, javax.swing.GroupLayout.DEFAULT_SIZE, 332, Short.MAX_VALUE)
   1.798 +                            .addComponent(odpovedetKomuJmeno, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 332, Short.MAX_VALUE)))
   1.799 +                    .addComponent(jLabel17, javax.swing.GroupLayout.DEFAULT_SIZE, 382, Short.MAX_VALUE)
   1.800 +                    .addComponent(odpovedetKomuHotovo, javax.swing.GroupLayout.Alignment.TRAILING))
   1.801 +                .addContainerGap())
   1.802 +        );
   1.803 +        odpovedetKomuDialogLayout.setVerticalGroup(
   1.804 +            odpovedetKomuDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
   1.805 +            .addGroup(odpovedetKomuDialogLayout.createSequentialGroup()
   1.806 +                .addContainerGap()
   1.807 +                .addGroup(odpovedetKomuDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
   1.808 +                    .addComponent(jLabel18)
   1.809 +                    .addComponent(odpovedetKomuJmeno, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
   1.810 +                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
   1.811 +                .addGroup(odpovedetKomuDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
   1.812 +                    .addComponent(jLabel19)
   1.813 +                    .addComponent(odpovedetKomuAdresa, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
   1.814 +                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
   1.815 +                .addComponent(jLabel17)
   1.816 +                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
   1.817 +                .addComponent(odpovedetKomuHotovo)
   1.818 +                .addContainerGap())
   1.819 +        );
   1.820 +
   1.821 +        setTitle("SuperPošťák");
   1.822 +        addWindowListener(new java.awt.event.WindowAdapter() {
   1.823 +            public void windowClosing(java.awt.event.WindowEvent evt) {
   1.824 +                formWindowClosing(evt);
   1.825 +            }
   1.826 +        });
   1.827 +
   1.828 +        jXHeader1.setDescription("Program pro posílání hromadných zpráv elektronickou poštou.\nNezneužívejte pro rozesílání spamu.");
   1.829 +        jXHeader1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/frantovo/superPostak/obrazky/xfmail.png"))); // NOI18N
   1.830 +        jXHeader1.setTitle("SuperPošťák");
   1.831 +
   1.832 +        taskPanel.setBackground(javax.swing.UIManager.getDefaults().getColor("Button.background"));
   1.833 +
   1.834 +        jXTaskPane1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/frantovo/superPostak/obrazky/mail_generic.png"))); // NOI18N
   1.835 +        jXTaskPane1.setTitle("Hromadná zpráva");
   1.836 +
   1.837 +        lnText.setMnemonic('z');
   1.838 +        lnText.setText("Text zprávy");
   1.839 +        lnText.setActionCommand("Zpráva");
   1.840 +        lnText.addActionListener(new java.awt.event.ActionListener() {
   1.841 +            public void actionPerformed(java.awt.event.ActionEvent evt) {
   1.842 +                lnTextActionPerformed(evt);
   1.843 +            }
   1.844 +        });
   1.845 +        jXTaskPane1.getContentPane().add(lnText);
   1.846 +
   1.847 +        lnPrijemci.setMnemonic('p');
   1.848 +        lnPrijemci.setText("Příjemci");
   1.849 +        lnPrijemci.addActionListener(new java.awt.event.ActionListener() {
   1.850 +            public void actionPerformed(java.awt.event.ActionEvent evt) {
   1.851 +                lnPrijemciActionPerformed(evt);
   1.852 +            }
   1.853 +        });
   1.854 +        jXTaskPane1.getContentPane().add(lnPrijemci);
   1.855 +
   1.856 +        lnOdeslat.setMnemonic('o');
   1.857 +        lnOdeslat.setText("Odeslat");
   1.858 +        lnOdeslat.addActionListener(new java.awt.event.ActionListener() {
   1.859 +            public void actionPerformed(java.awt.event.ActionEvent evt) {
   1.860 +                lnOdeslatActionPerformed(evt);
   1.861 +            }
   1.862 +        });
   1.863 +        jXTaskPane1.getContentPane().add(lnOdeslat);
   1.864 +
   1.865 +        taskPanel.add(jXTaskPane1);
   1.866 +
   1.867 +        jXTaskPane2.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/frantovo/superPostak/obrazky/gear.png"))); // NOI18N
   1.868 +        jXTaskPane2.setTitle("Nastavení");
   1.869 +
   1.870 +        lnServer.setMnemonic('s');
   1.871 +        lnServer.setText("Poštovní server");
   1.872 +        lnServer.addActionListener(new java.awt.event.ActionListener() {
   1.873 +            public void actionPerformed(java.awt.event.ActionEvent evt) {
   1.874 +                lnServerActionPerformed(evt);
   1.875 +            }
   1.876 +        });
   1.877 +        jXTaskPane2.getContentPane().add(lnServer);
   1.878 +
   1.879 +        lnDatabaze.setMnemonic('d');
   1.880 +        lnDatabaze.setText("Databáze");
   1.881 +        lnDatabaze.addActionListener(new java.awt.event.ActionListener() {
   1.882 +            public void actionPerformed(java.awt.event.ActionEvent evt) {
   1.883 +                lnDatabazeActionPerformed(evt);
   1.884 +            }
   1.885 +        });
   1.886 +        jXTaskPane2.getContentPane().add(lnDatabaze);
   1.887 +
   1.888 +        lnVychoziPrijemci.setMnemonic('v');
   1.889 +        lnVychoziPrijemci.setText("Výchozí příjemci");
   1.890 +        lnVychoziPrijemci.addActionListener(new java.awt.event.ActionListener() {
   1.891 +            public void actionPerformed(java.awt.event.ActionEvent evt) {
   1.892 +                lnVychoziPrijemciActionPerformed(evt);
   1.893 +            }
   1.894 +        });
   1.895 +        jXTaskPane2.getContentPane().add(lnVychoziPrijemci);
   1.896 +
   1.897 +        taskPanel.add(jXTaskPane2);
   1.898 +
   1.899 +        panel.setLayout(new java.awt.CardLayout());
   1.900 +
   1.901 +        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
   1.902 +        getContentPane().setLayout(layout);
   1.903 +        layout.setHorizontalGroup(
   1.904 +            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
   1.905 +            .addGroup(layout.createSequentialGroup()
   1.906 +                .addComponent(taskPanel, javax.swing.GroupLayout.PREFERRED_SIZE, 196, javax.swing.GroupLayout.PREFERRED_SIZE)
   1.907 +                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
   1.908 +                .addComponent(panel, javax.swing.GroupLayout.DEFAULT_SIZE, 342, Short.MAX_VALUE))
   1.909 +            .addComponent(jXHeader1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 544, Short.MAX_VALUE)
   1.910 +        );
   1.911 +        layout.setVerticalGroup(
   1.912 +            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
   1.913 +            .addGroup(layout.createSequentialGroup()
   1.914 +                .addComponent(jXHeader1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
   1.915 +                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
   1.916 +                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
   1.917 +                    .addComponent(taskPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 340, Short.MAX_VALUE)
   1.918 +                    .addComponent(panel, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 340, Short.MAX_VALUE)))
   1.919 +        );
   1.920 +
   1.921 +        pack();
   1.922 +    }// </editor-fold>//GEN-END:initComponents
   1.923 +    private void vstupPredmetActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_vstupPredmetActionPerformed
   1.924 +        
   1.925 +}//GEN-LAST:event_vstupPredmetActionPerformed
   1.926 +
   1.927 +    private void lnTextActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_lnTextActionPerformed
   1.928 +        setPanel(panelZprava);
   1.929 +    }//GEN-LAST:event_lnTextActionPerformed
   1.930 +
   1.931 +    private void lnPrijemciActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_lnPrijemciActionPerformed
   1.932 +        setPanel(panelPrijemci);
   1.933 +    }//GEN-LAST:event_lnPrijemciActionPerformed
   1.934 +
   1.935 +    private void lnOdeslatActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_lnOdeslatActionPerformed
   1.936 +        setPanel(panelOdeslat);
   1.937 +    }//GEN-LAST:event_lnOdeslatActionPerformed
   1.938 +
   1.939 +    private void lnServerActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_lnServerActionPerformed
   1.940 +        setPanel(panelServer);
   1.941 +    }//GEN-LAST:event_lnServerActionPerformed
   1.942 +
   1.943 +    private void lnDatabazeActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_lnDatabazeActionPerformed
   1.944 +        setPanel(panelDatabaze);
   1.945 +    }//GEN-LAST:event_lnDatabazeActionPerformed
   1.946 +
   1.947 +    private void lnVychoziPrijemciActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_lnVychoziPrijemciActionPerformed
   1.948 +        setPanel(panelVychoziPrijemci);
   1.949 +    }//GEN-LAST:event_lnVychoziPrijemciActionPerformed
   1.950 +
   1.951 +    private void formWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosing
   1.952 +        ulozNastaveni();
   1.953 +        log.log(Level.WARNING, "Ukončuji program.");
   1.954 +    }//GEN-LAST:event_formWindowClosing
   1.955 +
   1.956 +    /**
   1.957 +     * Sestaví zprávu na základě GUI vstupů. Všechno kromě příjemců,
   1.958 +     * ti se přidají až dodatečně, podle toho,
   1.959 +     * jestli jde o zkušební nebo skutečné rozesílání.
   1.960 +     */
   1.961 +    private HromadnaZprava getZprava() throws UnsupportedEncodingException {
   1.962 +        HromadnaZprava zprava = new HromadnaZprava();
   1.963 +        zprava.setOdesilatel(new InternetAddress(vstupAdresaOdesilatele.getText(), vstupJmenoOdesilatele.getText()));
   1.964 +        zprava.setPredmet(vstupPredmet.getText());
   1.965 +        zprava.setText(vstupZprava.getText());
   1.966 +        zprava.setFormatHTML(vstupFormatHTML.isSelected());
   1.967 +
   1.968 +        if (Postak.zkontrolujAdresu(odpovedetKomuAdresa.getText())) {
   1.969 +            InternetAddress komu = new InternetAddress();
   1.970 +            komu.setPersonal(odpovedetKomuJmeno.getText());
   1.971 +            komu.setAddress(odpovedetKomuAdresa.getText());
   1.972 +            zprava.setOdpovedetKomu(komu);
   1.973 +        }
   1.974 +
   1.975 +        return zprava;
   1.976 +    }
   1.977 +
   1.978 +    /** Všichni příjemci, kterým bude odeslána ostrá zpráva. */
   1.979 +    private ArrayList<InternetAddressKomu> getPrijemciVsichni() throws SQLException, UnsupportedEncodingException {
   1.980 +        ArrayList<InternetAddressKomu> vsichni = new ArrayList<InternetAddressKomu>();
   1.981 +        Collection<InternetAddressKomu> adresyVychozi = nastaveni.getVychoziPrijemci();
   1.982 +        Collection<InternetAddressKomu> adresySQL = getPrijemciSQL();
   1.983 +        Collection<InternetAddressKomu> adresyDodatecne = prijemciDodatecni.getAdresy();
   1.984 +
   1.985 +        if (adresyVychozi != null) {
   1.986 +            vsichni.addAll(adresyVychozi);
   1.987 +        }
   1.988 +        if (adresySQL != null) {
   1.989 +            vsichni.addAll(adresySQL);
   1.990 +        }
   1.991 +        if (adresyDodatecne != null) {
   1.992 +            vsichni.addAll(adresyDodatecne);
   1.993 +        }
   1.994 +        return vsichni;
   1.995 +    }
   1.996 +
   1.997 +    private void rozeslatHromadnouZpravuTlacitkoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_rozeslatHromadnouZpravuTlacitkoActionPerformed
   1.998 +        try {
   1.999 +            ulozNastaveniGUI();
  1.1000 +            HromadnaZprava zprava = getZprava();
  1.1001 +            zprava.setPrijemci(getPrijemciVsichni());
  1.1002 +
  1.1003 +            int volba = JOptionPane.showOptionDialog(this, "Počet příjemců hromadné zprávy: " + zprava.getPrijemci().size() + "\nPřejete si zprávu odeslat?", "Potvrdit odeslání", JOptionPane.YES_NO_OPTION, JOptionPane.INFORMATION_MESSAGE, null, null, null);
  1.1004 +            if (volba == JOptionPane.YES_OPTION) {
  1.1005 +                odesli(zprava);
  1.1006 +                Postak.vypisPrijemce(zprava.getPrijemci());
  1.1007 +                zobrazInformacniDialog("Odesláno", "Zpráva byla odeslána.\nPočet příjemců: " + zprava.getPrijemci().size(), true);
  1.1008 +            }
  1.1009 +        } catch (Exception e) {
  1.1010 +            zobrazChybovyDialog("Zprávu se nepodařilo odeslat", e, Level.SEVERE, true);
  1.1011 +        }
  1.1012 +}//GEN-LAST:event_rozeslatHromadnouZpravuTlacitkoActionPerformed
  1.1013 +
  1.1014 +    private void rozeslatZkusebniTlacitkoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_rozeslatZkusebniTlacitkoActionPerformed
  1.1015 +        try {
  1.1016 +            ulozNastaveniGUI();
  1.1017 +            HromadnaZprava zprava = getZprava();
  1.1018 +            zprava.setPrijemci(prijemciZkusebni.getAdresy());
  1.1019 +
  1.1020 +            odesli(zprava);
  1.1021 +
  1.1022 +            zobrazInformacniDialog("Odesláno", "Zkušební zpráva byla odeslána.\nPočet adresátů: " + zprava.getPrijemci().size(), true);
  1.1023 +        } catch (Exception e) {
  1.1024 +            zobrazChybovyDialog("Zkušební zprávu se nepodařilo odeslat", e, Level.SEVERE, true);
  1.1025 +        }        
  1.1026 +    }//GEN-LAST:event_rozeslatZkusebniTlacitkoActionPerformed
  1.1027 +
  1.1028 +    private void vyzkousetPripojeniTlacitkoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_vyzkousetPripojeniTlacitkoActionPerformed
  1.1029 +        try {
  1.1030 +            getSpojeni();//GEN-LAST:event_vyzkousetPripojeniTlacitkoActionPerformed
  1.1031 +            zobrazInformacniDialog("Připojeno k DB", "Připojení k DB proběhlo úspěšně", false);
  1.1032 +        } catch (SQLException e) {
  1.1033 +            zobrazChybovyDialog("Spojení s DB", "Připojení k databázi selhalo", null, e, Level.SEVERE, true);
  1.1034 +        }
  1.1035 +    }
  1.1036 +
  1.1037 +    private void vyzkousetSQLTlacitkoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_vyzkousetSQLTlacitkoActionPerformed
  1.1038 +        try {
  1.1039 +            Collection<InternetAddressKomu> adresy = getPrijemciSQL();//GEN-LAST:event_vyzkousetSQLTlacitkoActionPerformed
  1.1040 +            if (adresy == null) {
  1.1041 +                zobrazInformacniDialog("SQL dotaz", "Dotaz do databáze neproběhl.\nSQL dotaz je prázdný.", false);
  1.1042 +            } else {
  1.1043 +                zobrazInformacniDialog("SQL dotaz", "Dotaz do databáze byl úspěšný.\nPočet získaných záznamů: " + adresy.size(), false);
  1.1044 +            }
  1.1045 +        } catch (Exception e) {
  1.1046 +            zobrazChybovyDialog("SQL dotaz", "Provedení SQL příkazu selhalo selhalo", null, e, Level.SEVERE, true);
  1.1047 +        }
  1.1048 +    }
  1.1049 +
  1.1050 +    private void zobrazitSQLPrijemceTlacitkoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_zobrazitSQLPrijemceTlacitkoActionPerformed
  1.1051 +        try {
  1.1052 +            Collection<InternetAddressKomu> adresy = getPrijemciSQL();
  1.1053 +
  1.1054 +            ZobrazovacAdres zobrazovac = new ZobrazovacAdres(this, false);
  1.1055 +            zobrazovac.setAdresy(adresy);
  1.1056 +            zobrazovac.setLocationRelativeTo(this);
  1.1057 +            zobrazovac.setVisible(true);
  1.1058 +
  1.1059 +        } catch (Exception e) {
  1.1060 +            zobrazChybovyDialog("SQL dotaz", "Provedení SQL příkazu selhalo selhalo", null, e, Level.SEVERE, true);
  1.1061 +        }
  1.1062 +    }//GEN-LAST:event_zobrazitSQLPrijemceTlacitkoActionPerformed
  1.1063 +
  1.1064 +    private void zobrazitVsechnyPrijemceTlacitkoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_zobrazitVsechnyPrijemceTlacitkoActionPerformed
  1.1065 +        try {
  1.1066 +            Collection<InternetAddressKomu> adresy = getPrijemciVsichni();
  1.1067 +
  1.1068 +            ZobrazovacAdres zobrazovac = new ZobrazovacAdres(this, false);
  1.1069 +            zobrazovac.setAdresy(adresy);
  1.1070 +            zobrazovac.setLocationRelativeTo(this);
  1.1071 +            zobrazovac.setVisible(true);
  1.1072 +
  1.1073 +        } catch (Exception e) {
  1.1074 +            zobrazChybovyDialog("SQL dotaz", "Provedení SQL příkazu selhalo selhalo", null, e, Level.SEVERE, true);
  1.1075 +        }
  1.1076 +    }//GEN-LAST:event_zobrazitVsechnyPrijemceTlacitkoActionPerformed
  1.1077 +
  1.1078 +    private void odpovedetKomuOdkazActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_odpovedetKomuOdkazActionPerformed
  1.1079 +        odpovedetKomuDialog.pack();
  1.1080 +        odpovedetKomuDialog.setLocationRelativeTo(this);
  1.1081 +        odpovedetKomuDialog.setModalityType(ModalityType.APPLICATION_MODAL);
  1.1082 +        odpovedetKomuDialog.getRootPane().setDefaultButton(odpovedetKomuHotovo);
  1.1083 +        odpovedetKomuDialog.setVisible(true);
  1.1084 +}//GEN-LAST:event_odpovedetKomuOdkazActionPerformed
  1.1085 +
  1.1086 +    private void odpovedetKomuHotovoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_odpovedetKomuHotovoActionPerformed
  1.1087 +        odpovedetKomuDialog.setVisible(false);
  1.1088 +}//GEN-LAST:event_odpovedetKomuHotovoActionPerformed
  1.1089 +
  1.1090 +    /** Provede uživatelem zadaný SQL dotaz a vrátí získané příjemce */
  1.1091 +    private Collection<InternetAddressKomu> getPrijemciSQL() throws SQLException, UnsupportedEncodingException {
  1.1092 +        if ("".equals(vstupSQL.getText())) {
  1.1093 +            return null;
  1.1094 +        } else {
  1.1095 +            return getSpojeni().getAdresy(vstupSQL.getText());
  1.1096 +        }
  1.1097 +    }
  1.1098 +
  1.1099 +    private DataSQL getSpojeni() throws SQLException {
  1.1100 +        return Data.getSpojeniSQL(vstupDatabaze.getText(), vstupDBjmeno.getText(), vstupDBheslo.getPassword());
  1.1101 +    }
  1.1102 +
  1.1103 +    /** Obalovací třída, která v průběhu odesílání zobrazuje kurzor s hodinami. */
  1.1104 +    private void odesli(HromadnaZprava zprava) throws MessagingException {
  1.1105 +        setCursor(new Cursor(Cursor.WAIT_CURSOR));
  1.1106 +        try {
  1.1107 +            postak.setNastaveni(nastaveni);
  1.1108 +            postak.odesli(zprava);
  1.1109 +
  1.1110 +        } catch (MessagingException e) {
  1.1111 +            throw e;
  1.1112 +        } finally {
  1.1113 +            setCursor(Cursor.getDefaultCursor());
  1.1114 +        }
  1.1115 +    }
  1.1116 +
  1.1117 +    private void setPanel(JComponent komponenta) {
  1.1118 +
  1.1119 +        if (panel.getLayout() instanceof CardLayout) {
  1.1120 +            CardLayout l = (CardLayout) panel.getLayout();
  1.1121 +            l.show(panel, komponenta.getName());
  1.1122 +        } else {
  1.1123 +            log.log(Level.WARNING, "Neplatí: panel.getLayout() instanceof CardLayout");
  1.1124 +        }
  1.1125 +
  1.1126 +    }
  1.1127 +
  1.1128 +    /** Změní chování tabulátoru v textovém poli - aby se pomocí TABu dalo skočit na další komponentu */
  1.1129 +    private void vyresitTabFocusProblem(JTextArea textArea) {
  1.1130 +        textArea.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, null);
  1.1131 +        textArea.setFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS, null);
  1.1132 +    }
  1.1133 +
  1.1134 +    public JXTaskPaneContainer getTaskPanel() {
  1.1135 +        return taskPanel;
  1.1136 +    }
  1.1137 +
  1.1138 +    /**
  1.1139 +     * @param args the command line arguments
  1.1140 +     */
  1.1141 +    public static void main(String args[]) {
  1.1142 +        final boolean ladit = (args != null && args.length > 0 && args[0].equals("ladit"));
  1.1143 +
  1.1144 +        /**try {
  1.1145 +            //LookAndFeel laf = UIManager.getLookAndFeel();
  1.1146 +
  1.1147 +            //laf = new SubstanceLookAndFeel();
  1.1148 +            //laf = new SubstanceBusinessLookAndFeel();
  1.1149 +            //laf = new SubstanceBusinessBlueSteelLookAndFeel();
  1.1150 +            //laf = new SubstanceBusinessBlackSteelLookAndFeel();
  1.1151 +
  1.1152 +            UIManager.setLookAndFeel("org.jvnet.substance.skin.SubstanceBusinessBlueSteelLookAndFeel");
  1.1153 +        } catch (ClassNotFoundException ex) {
  1.1154 +            log.log(Level.SEVERE, null, ex);
  1.1155 +        } catch (InstantiationException ex) {
  1.1156 +            log.log(Level.SEVERE, null, ex);
  1.1157 +        } catch (IllegalAccessException ex) {
  1.1158 +            log.log(Level.SEVERE, null, ex);
  1.1159 +        } catch (UnsupportedLookAndFeelException ex) {
  1.1160 +            log.log(Level.SEVERE, null, ex);
  1.1161 +        } */
  1.1162 +
  1.1163 +        java.awt.EventQueue.invokeLater(new Runnable() {
  1.1164 +
  1.1165 +            public void run() {
  1.1166 +                new SuperPostak(ladit, true).setVisible(true);
  1.1167 +            }
  1.1168 +            });
  1.1169 +    }
  1.1170 +    // Variables declaration - do not modify//GEN-BEGIN:variables
  1.1171 +    private javax.swing.JLabel jLabel1;
  1.1172 +    private javax.swing.JLabel jLabel10;
  1.1173 +    private javax.swing.JLabel jLabel11;
  1.1174 +    private javax.swing.JLabel jLabel12;
  1.1175 +    private javax.swing.JLabel jLabel13;
  1.1176 +    private javax.swing.JLabel jLabel14;
  1.1177 +    private javax.swing.JLabel jLabel15;
  1.1178 +    private javax.swing.JLabel jLabel16;
  1.1179 +    private javax.swing.JLabel jLabel17;
  1.1180 +    private javax.swing.JLabel jLabel18;
  1.1181 +    private javax.swing.JLabel jLabel19;
  1.1182 +    private javax.swing.JLabel jLabel2;
  1.1183 +    private javax.swing.JLabel jLabel4;
  1.1184 +    private javax.swing.JLabel jLabel5;
  1.1185 +    private javax.swing.JLabel jLabel6;
  1.1186 +    private javax.swing.JLabel jLabel7;
  1.1187 +    private javax.swing.JLabel jLabel8;
  1.1188 +    private javax.swing.JLabel jLabel9;
  1.1189 +    private javax.swing.JPanel jPanel1;
  1.1190 +    private javax.swing.JScrollPane jScrollPane1;
  1.1191 +    private javax.swing.JScrollPane jScrollPane3;
  1.1192 +    private javax.swing.JSeparator jSeparator1;
  1.1193 +    private javax.swing.JSeparator jSeparator2;
  1.1194 +    private org.jdesktop.swingx.JXHeader jXHeader1;
  1.1195 +    private org.jdesktop.swingx.JXTaskPane jXTaskPane1;
  1.1196 +    private org.jdesktop.swingx.JXTaskPane jXTaskPane2;
  1.1197 +    private org.jdesktop.swingx.JXHyperlink lnDatabaze;
  1.1198 +    private org.jdesktop.swingx.JXHyperlink lnOdeslat;
  1.1199 +    private org.jdesktop.swingx.JXHyperlink lnPrijemci;
  1.1200 +    private org.jdesktop.swingx.JXHyperlink lnServer;
  1.1201 +    private org.jdesktop.swingx.JXHyperlink lnText;
  1.1202 +    private org.jdesktop.swingx.JXHyperlink lnVychoziPrijemci;
  1.1203 +    private javax.swing.JTextArea napovedaSMTP;
  1.1204 +    private javax.swing.JScrollPane napovedaSMTPscroll;
  1.1205 +    private javax.swing.JTextField odpovedetKomuAdresa;
  1.1206 +    private javax.swing.JDialog odpovedetKomuDialog;
  1.1207 +    private javax.swing.JButton odpovedetKomuHotovo;
  1.1208 +    private javax.swing.JTextField odpovedetKomuJmeno;
  1.1209 +    private org.jdesktop.swingx.JXHyperlink odpovedetKomuOdkaz;
  1.1210 +    private org.jdesktop.swingx.JXPanel panel;
  1.1211 +    private org.jdesktop.swingx.JXPanel panelDatabaze;
  1.1212 +    private org.jdesktop.swingx.JXPanel panelOdeslat;
  1.1213 +    private org.jdesktop.swingx.JXPanel panelPrijemci;
  1.1214 +    private org.jdesktop.swingx.JXPanel panelServer;
  1.1215 +    private org.jdesktop.swingx.JXPanel panelVychoziPrijemci;
  1.1216 +    private org.jdesktop.swingx.JXPanel panelZprava;
  1.1217 +    private cz.frantovo.superPostak.PanelPrijemcu prijemciDodatecni;
  1.1218 +    private cz.frantovo.superPostak.PanelPrijemcu prijemciVychozi;
  1.1219 +    private cz.frantovo.superPostak.PanelPrijemcu prijemciZkusebni;
  1.1220 +    private javax.swing.JButton rozeslatHromadnouZpravuTlacitko;
  1.1221 +    private javax.swing.JButton rozeslatZkusebniTlacitko;
  1.1222 +    private org.jdesktop.swingx.JXTaskPaneContainer taskPanel;
  1.1223 +    private javax.swing.JTextField vstupAdresaOdesilatele;
  1.1224 +    private javax.swing.JPasswordField vstupDBheslo;
  1.1225 +    private javax.swing.JTextField vstupDBjmeno;
  1.1226 +    private javax.swing.JTextField vstupDatabaze;
  1.1227 +    private javax.swing.JCheckBox vstupFormatHTML;
  1.1228 +    private javax.swing.JTextField vstupJmenoOdesilatele;
  1.1229 +    private javax.swing.JTextField vstupPredmet;
  1.1230 +    private javax.swing.JPasswordField vstupSMTPheslo;
  1.1231 +    private javax.swing.JTextField vstupSMTPjmeno;
  1.1232 +    private javax.swing.JSpinner vstupSMTPlimitPrijemcu;
  1.1233 +    private javax.swing.JSpinner vstupSMTPport;
  1.1234 +    private javax.swing.JTextField vstupSMTPserver;
  1.1235 +    private javax.swing.JTextArea vstupSQL;
  1.1236 +    private javax.swing.JTextArea vstupZprava;
  1.1237 +    private javax.swing.JLabel vystupDBzprava;
  1.1238 +    private javax.swing.JLabel vystupSQLZprava;
  1.1239 +    private javax.swing.JButton vyzkousetPripojeniTlacitko;
  1.1240 +    private javax.swing.JButton vyzkousetSQLTlacitko;
  1.1241 +    private javax.swing.JButton zobrazitSQLPrijemceTlacitko;
  1.1242 +    private javax.swing.JButton zobrazitVsechnyPrijemceTlacitko;
  1.1243 +    // End of variables declaration//GEN-END:variables
  1.1244 +}