java/SuperPostak/src/cz/frantovo/superPostak/SuperPostak.java
author František Kučera <franta-hg@frantovo.cz>
Fri, 30 Mar 2012 15:35:17 +0200
changeset 15 9175a185d9c0
parent 14 3a12bd9312b1
child 17 9cb46ca7e26c
permissions -rw-r--r--
Ukládání seznamu zkušebních příjemců → nemusejí se zadávat pokaždé znovu.
     1 package cz.frantovo.superPostak;
     2 
     3 import cz.frantovo.postak.HromadnaZprava;
     4 import cz.frantovo.postak.InternetAddressKomu;
     5 import cz.frantovo.postak.Nastaveni;
     6 import cz.frantovo.postak.Postak;
     7 import java.awt.CardLayout;
     8 import java.awt.Component;
     9 import java.awt.Cursor;
    10 import java.awt.Dialog.ModalityType;
    11 import java.awt.KeyboardFocusManager;
    12 import java.beans.XMLDecoder;
    13 import java.beans.XMLEncoder;
    14 import java.io.BufferedInputStream;
    15 import java.io.BufferedOutputStream;
    16 import java.io.File;
    17 import java.io.FileInputStream;
    18 import java.io.FileNotFoundException;
    19 import java.io.FileOutputStream;
    20 import java.io.IOException;
    21 import java.io.UnsupportedEncodingException;
    22 import java.sql.SQLException;
    23 import java.util.ArrayList;
    24 import java.util.Collection;
    25 import java.util.logging.Level;
    26 import java.util.logging.Logger;
    27 import java.util.zip.GZIPInputStream;
    28 import java.util.zip.GZIPOutputStream;
    29 import javax.mail.MessagingException;
    30 import javax.mail.internet.InternetAddress;
    31 import javax.swing.JComponent;
    32 import javax.swing.JDialog;
    33 import javax.swing.JOptionPane;
    34 import javax.swing.JTextArea;
    35 import javax.swing.UIManager;
    36 import javax.swing.UnsupportedLookAndFeelException;
    37 import org.jdesktop.swingx.JXErrorPane;
    38 import org.jdesktop.swingx.JXTaskPaneContainer;
    39 import org.jdesktop.swingx.error.ErrorInfo;
    40 
    41 /**
    42  *
    43  * @author  fiki
    44  */
    45 public class SuperPostak extends javax.swing.JFrame {
    46 
    47 	/** Soubor, kde je uložené nastavení */
    48 	private static final String NASTAVENI_SOUBOR = "Nastaveni.xml.gz";
    49 	private static final String CERTIFIKATY_SOUBOR = "DuveryhodneCertifikaty.keystore";
    50 	private static final String NASTAVENI_SLOZKA = ".SuperPostak";
    51 	private static final String DOMACI_ADRESAR = System.getProperty("user.home");
    52 	private static final Logger log = Logger.getLogger(SuperPostak.class.getName());
    53 	private static final long serialVersionUID = -7026850569575604048L;
    54 	private Nastaveni nastaveni = new Nastaveni();
    55 	private Postak postak = new Postak(nastaveni);
    56 
    57 	/**
    58 	 * Creates new form SuperPostak
    59 	 * @param ladit předvyplní testovací hodnoty - zprávu
    60 	 * @param exit při zavření okna ukončí program
    61 	 */
    62 	public SuperPostak(boolean ladit, boolean exit) {
    63 		log.log(Level.WARNING, "Program byl spuštěn.");
    64 		nactiOvladaceJDBC();
    65 		vytvorSlozkuProgramu();
    66 		initComponents();
    67 
    68 		nactiNastaveni();
    69 		ulozNastaveni();
    70 		nastaveni.setCestaKCertifikatum(getCestaKCertifikatum());
    71 
    72 		inicializujCardLayout();
    73 		setLocationRelativeTo(null);
    74 
    75 		/** Kvůli souborovým dialogům – aby se otvírali ve stejné složce jako minule. */
    76 		prijemciDodatecni.setNastaveni(nastaveni);
    77 		prijemciVychozi.setNastaveni(nastaveni);
    78 		prijemciZkusebni.setNastaveni(nastaveni);
    79 
    80 		/** Vyřešíme problém TAB vs. Focus */
    81 		vyresitTabFocusProblem(vstupSQL);
    82 		vyresitTabFocusProblem(vstupZprava);
    83 
    84 		/** Ladicí hodnoty */
    85 		if (ladit) {
    86 			nastavLadiciHodnoty();
    87 		}
    88 
    89 		if (exit) {
    90 			setDefaultCloseOperation(EXIT_ON_CLOSE);
    91 		}
    92 
    93 
    94 	}
    95 
    96 	private void inicializujCardLayout() {
    97 		panelDatabaze.setName("panelDatabaze");
    98 		panelOdeslat.setName("panelOdeslat");
    99 		panelPrijemci.setName("panelPrijemci");
   100 		panelServer.setName("panelServer");
   101 		panelVychoziPrijemci.setName("panelVychoziPrijemci");
   102 		panelZprava.setName("panelZprava");
   103 
   104 		panel.add(panelDatabaze, panelDatabaze.getName());
   105 		panel.add(panelOdeslat, panelOdeslat.getName());
   106 		panel.add(panelPrijemci, panelPrijemci.getName());
   107 		panel.add(panelServer, panelServer.getName());
   108 		panel.add(panelVychoziPrijemci, panelVychoziPrijemci.getName());
   109 		panel.add(panelZprava, panelZprava.getName());
   110 
   111 		setPanel(panelZprava);
   112 		pack();
   113 	}
   114 
   115 	/**
   116 	 * Vyplní formuláře (odesílatel, předmět, zpráva, příjemci...) výchozími hodnotami,
   117 	 * aby se dal program testovat jedním kliknutím.
   118 	 */
   119 	private void nastavLadiciHodnoty() {
   120 		try {
   121 			vstupAdresaOdesilatele.setText("SuperPostak@frantovo.cz");
   122 			vstupJmenoOdesilatele.setText("SuperPošťák");
   123 			vstupPredmet.setText("Zkušební zpráva od SuperPošťáka");
   124 			vstupZprava.setText("Toto je obyčejná zkušební zpráva v češtině :-)");
   125 			ArrayList<InternetAddressKomu> adresy = new ArrayList<InternetAddressKomu>();
   126 			adresy.add(new InternetAddressKomu("SuperPostak@frantovo.cz", "SuperPošťák"));
   127 			prijemciZkusebni.setAdresy(adresy);
   128 		} catch (UnsupportedEncodingException e) {
   129 			log.log(Level.SEVERE, null, e);
   130 		}
   131 	}
   132 
   133 	/**
   134 	 * Pokusíme se načíst ovladače pro různé DB a výsledek zapíšeme do logu.
   135 	 * Další ovladače je možné přidat pomocí manifestu v příslušných knihovnách.
   136 	 * viz http://www.sweb.cz/pichlik/archive/2006_08_06_archive.html#115502885631518161
   137 	 */
   138 	private void nactiOvladaceJDBC() {
   139 		nactiOvladacJDBC("org.postgresql.Driver", "PostgreSQL");
   140 		nactiOvladacJDBC("com.mysql.jdbc.Driver", "MySQL");
   141 		nactiOvladacJDBC("net.sourceforge.jtds.jdbc.Driver", "jTDS Sybase a MS SQL");
   142 		nactiOvladacJDBC("com.sybase.jdbc2.jdbc.SybDriver", "Sybase.com");
   143 		nactiOvladacJDBC("oracle.jdbc.OracleDriver", "Oracle");
   144 	}
   145 
   146 	/**
   147 	 * @param trida ovladač databáze, který se má načíst
   148 	 * @param jmeno název databáze
   149 	 */
   150 	private void nactiOvladacJDBC(String trida, String jmeno) {
   151 		try {
   152 			Class.forName(trida);
   153 			log.log(Level.INFO, "JDBC ovladač pro {0} byl úspěšně načten.", jmeno);
   154 		} catch (ClassNotFoundException e) {
   155 			log.log(Level.INFO, "JDBC ovladač pro {0} se nepodařilo načíst.", jmeno);
   156 		}
   157 	}
   158 
   159 	/** Vrací plnou cestu k souboru s nastavením */
   160 	protected static String getCestaKCertifikatum() {
   161 		return getCestaKeSlozceProgramu() + CERTIFIKATY_SOUBOR;
   162 	}
   163 
   164 	/** Vrací plnou cestu k souboru s nastavením */
   165 	protected static String getCestaKNastaveni() {
   166 		return getCestaKeSlozceProgramu() + NASTAVENI_SOUBOR;
   167 	}
   168 
   169 	/** Vrací plnou cestu ke složce programu (nastavení, certifikáty a logy) */
   170 	protected static String getCestaKeSlozceProgramu() {
   171 		return DOMACI_ADRESAR + File.separator + NASTAVENI_SLOZKA + File.separator;
   172 	}
   173 
   174 	/** Načte nastavení ze souboru */
   175 	private void nactiNastaveni() {
   176 		try {
   177 			XMLDecoder d = new XMLDecoder(new BufferedInputStream(new GZIPInputStream(new FileInputStream(getCestaKNastaveni()))));
   178 			Object xmlObjekt = d.readObject();
   179 			d.close();
   180 
   181 			if (xmlObjekt instanceof Nastaveni) {
   182 				nastaveni = (Nastaveni) xmlObjekt;
   183 			} else {
   184 				nastaveni = new Nastaveni();
   185 				log.log(Level.SEVERE, "Nepodařilo se načíst nastavení: není instancí");
   186 			}
   187 
   188 			nactiNastaveniGUI();
   189 
   190 			log.log(Level.INFO, "Nastavení bylo načteno.");
   191 		} catch (FileNotFoundException ex) {
   192 			log.log(Level.SEVERE, "Nepodařilo se načíst nastavení: soubor nenalezen", ex);
   193 		} catch (IOException ex) {
   194 			log.log(Level.SEVERE, "Nastavení se nepodařilo načíst: I/O.", ex);
   195 		}
   196 	}
   197 
   198 	/** Vytvoří (pokud neexistuje) v domovském adresáři složku, kam se ukládá nastavení a případně logy */
   199 	private static boolean vytvorSlozkuProgramu() {
   200 		if (new File(getCestaKeSlozceProgramu()).mkdirs()) {
   201 			log.log(Level.INFO, "Složka pro nastavení programu byla vytvořena: {0}", getCestaKeSlozceProgramu());
   202 			return true;
   203 		} else {
   204 			return false;
   205 		}
   206 	}
   207 
   208 	/** Uloží nastavení do souboru */
   209 	private void ulozNastaveni() {
   210 		try {
   211 			ulozNastaveniGUI();
   212 
   213 			vytvorSlozkuProgramu();
   214 
   215 			XMLEncoder e = new XMLEncoder(new BufferedOutputStream(new GZIPOutputStream(new FileOutputStream(getCestaKNastaveni()))));
   216 			e.writeObject(nastaveni);
   217 			e.close();
   218 			log.log(Level.INFO, "Nastavení bylo uloženo.");
   219 		} catch (FileNotFoundException ex) {
   220 			log.log(Level.SEVERE, "Nastavení se nepodařilo uložit: soubor nenalezen.", ex);
   221 		} catch (IOException ex) {
   222 			log.log(Level.SEVERE, "Nastavení se nepodařilo uložit: I/O.", ex);
   223 		}
   224 	}
   225 
   226 	/** Posbírá zadané hodnoty z GUI a uloží je do objektu nastaveni */
   227 	private void ulozNastaveniGUI() {
   228 		nastaveni.setDatabaze(vstupDatabaze.getText());
   229 		nastaveni.setDbHeslo(vstupDBheslo.getPassword());
   230 		nastaveni.setDbJmeno(vstupDBjmeno.getText());
   231 		nastaveni.setLimitZprav((Integer) vstupSMTPlimitPrijemcu.getValue());
   232 		nastaveni.setPostovniHeslo(vstupSMTPheslo.getPassword());
   233 		nastaveni.setPostovniJmeno(vstupSMTPjmeno.getText());
   234 		nastaveni.setPostovniPort((Integer) vstupSMTPport.getValue());
   235 		nastaveni.setPostovniServer(vstupSMTPserver.getText());
   236 		nastaveni.setVychoziPrijemci(prijemciVychozi.getAdresy());
   237 		nastaveni.setZkušebníPrijemci(prijemciZkusebni.getAdresy());
   238 	}
   239 
   240 	/** Aktualizuje GUI formuláře hodnotami z objektu nastaveni */
   241 	private void nactiNastaveniGUI() {
   242 		vstupDatabaze.setText(nastaveni.getDatabaze());
   243 		if (nastaveni.getDbHeslo() != null) {
   244 			vstupDBheslo.setText(String.valueOf(nastaveni.getDbHeslo()));
   245 		}
   246 		vstupDBjmeno.setText(nastaveni.getDbJmeno());
   247 		vstupSMTPlimitPrijemcu.setValue(nastaveni.getLimitZprav());
   248 		if (nastaveni.getPostovniHeslo() != null) {
   249 			vstupSMTPheslo.setText(String.valueOf(nastaveni.getPostovniHeslo()));
   250 		}
   251 		vstupSMTPjmeno.setText(nastaveni.getPostovniJmeno());
   252 		vstupSMTPport.setValue(nastaveni.getPostovniPort());
   253 		vstupSMTPserver.setText(nastaveni.getPostovniServer());
   254 		prijemciVychozi.setAdresy(nastaveni.getVychoziPrijemci());
   255 		prijemciZkusebni.setAdresy(nastaveni.getZkušebníPrijemci());
   256 	}
   257 
   258 	protected static void zobrazChybovyDialog(Component vlastnik, String strucnaZprava, Throwable vyjimka, Level zavaznost, boolean logovat) {
   259 		zobrazChybovyDialog(vlastnik, "Chyba", strucnaZprava, null, vyjimka, zavaznost, logovat);
   260 	}
   261 
   262 	protected static void zobrazInformacniDialog(Component vlastnik, String nadpis, String text, boolean loguj) {
   263 		JOptionPane.showMessageDialog(vlastnik, text, nadpis, JOptionPane.INFORMATION_MESSAGE);
   264 		if (loguj) {
   265 			log.log(Level.INFO, "{0}: {1}", new Object[]{nadpis, text});
   266 		}
   267 	}
   268 
   269 	protected static void zobrazChybovyDialog(Component vlastnik, String nadpis, String strucnaZprava, String podrobnaZprava, Throwable vyjimka, Level zavaznost, boolean logovat) {
   270 		if (logovat) {
   271 			log.log(zavaznost, strucnaZprava, vyjimka);
   272 		}
   273 
   274 		JXErrorPane chybovyPanel = new JXErrorPane();
   275 		ErrorInfo chybovaInformace = new ErrorInfo(nadpis, strucnaZprava, podrobnaZprava, null, vyjimka, zavaznost, null);
   276 		chybovyPanel.setErrorInfo(chybovaInformace);
   277 		JDialog dialog = JXErrorPane.createDialog(vlastnik, chybovyPanel);
   278 		dialog.setVisible(true);
   279 	}
   280 
   281 	private void zobrazChybovyDialog(String strucnaZprava, Throwable vyjimka, Level zavaznost, boolean logovat) {
   282 		zobrazChybovyDialog(this, strucnaZprava, vyjimka, zavaznost, logovat);
   283 	}
   284 
   285 	private void zobrazInformacniDialog(String nadpis, String text, boolean loguj) {
   286 		zobrazInformacniDialog(this, nadpis, text, loguj);
   287 	}
   288 
   289 	private void zobrazChybovyDialog(String nadpis, String strucnaZprava, String podrobnaZprava, Throwable vyjimka, Level zavaznost, boolean logovat) {
   290 		zobrazChybovyDialog(this, nadpis, strucnaZprava, podrobnaZprava, vyjimka, zavaznost, logovat);
   291 	}
   292 
   293 	/** This method is called from within the constructor to
   294 	 * initialize the form.
   295 	 * WARNING: Do NOT modify this code. The content of this method is
   296 	 * always regenerated by the Form Editor.
   297 	 */
   298     // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
   299     private void initComponents() {
   300 
   301         panelDatabaze = new org.jdesktop.swingx.JXPanel();
   302         jLabel9 = new javax.swing.JLabel();
   303         vstupDatabaze = new javax.swing.JTextField();
   304         jLabel10 = new javax.swing.JLabel();
   305         vstupDBjmeno = new javax.swing.JTextField();
   306         vstupDBheslo = new javax.swing.JPasswordField();
   307         jLabel11 = new javax.swing.JLabel();
   308         vyzkousetPripojeniTlacitko = new javax.swing.JButton();
   309         vystupDBzprava = new javax.swing.JLabel();
   310         panelOdeslat = new org.jdesktop.swingx.JXPanel();
   311         jPanel1 = new javax.swing.JPanel();
   312         rozeslatZkusebniTlacitko = new javax.swing.JButton();
   313         rozeslatHromadnouZpravuTlacitko = new javax.swing.JButton();
   314         zobrazitVsechnyPrijemceTlacitko = new javax.swing.JButton();
   315         prijemciZkusebni = new cz.frantovo.superPostak.PanelPrijemcu();
   316         jSeparator2 = new javax.swing.JSeparator();
   317         jLabel14 = new javax.swing.JLabel();
   318         panelPrijemci = new org.jdesktop.swingx.JXPanel();
   319         jLabel13 = new javax.swing.JLabel();
   320         jScrollPane3 = new javax.swing.JScrollPane();
   321         vstupSQL = new javax.swing.JTextArea();
   322         vyzkousetSQLTlacitko = new javax.swing.JButton();
   323         vystupSQLZprava = new javax.swing.JLabel();
   324         prijemciDodatecni = new cz.frantovo.superPostak.PanelPrijemcu();
   325         jSeparator1 = new javax.swing.JSeparator();
   326         jLabel16 = new javax.swing.JLabel();
   327         zobrazitSQLPrijemceTlacitko = new javax.swing.JButton();
   328         panelServer = new org.jdesktop.swingx.JXPanel();
   329         jLabel4 = new javax.swing.JLabel();
   330         jLabel5 = new javax.swing.JLabel();
   331         vstupSMTPserver = new javax.swing.JTextField();
   332         vstupSMTPport = new javax.swing.JSpinner();
   333         napovedaSMTPscroll = new javax.swing.JScrollPane();
   334         napovedaSMTP = new javax.swing.JTextArea();
   335         jLabel6 = new javax.swing.JLabel();
   336         vstupSMTPjmeno = new javax.swing.JTextField();
   337         vstupSMTPheslo = new javax.swing.JPasswordField();
   338         jLabel7 = new javax.swing.JLabel();
   339         vstupSMTPlimitPrijemcu = new javax.swing.JSpinner();
   340         jLabel8 = new javax.swing.JLabel();
   341         panelVychoziPrijemci = new org.jdesktop.swingx.JXPanel();
   342         prijemciVychozi = new cz.frantovo.superPostak.PanelPrijemcu();
   343         jLabel12 = new javax.swing.JLabel();
   344         panelZprava = new org.jdesktop.swingx.JXPanel();
   345         jLabel1 = new javax.swing.JLabel();
   346         vstupPredmet = new javax.swing.JTextField();
   347         jLabel2 = new javax.swing.JLabel();
   348         vstupJmenoOdesilatele = new javax.swing.JTextField();
   349         vstupAdresaOdesilatele = new javax.swing.JTextField();
   350         jScrollPane1 = new javax.swing.JScrollPane();
   351         vstupZprava = new javax.swing.JTextArea();
   352         jLabel15 = new javax.swing.JLabel();
   353         vstupFormatHTML = new javax.swing.JCheckBox();
   354         odpovedetKomuOdkaz = new org.jdesktop.swingx.JXHyperlink();
   355         odpovedetKomuDialog = new javax.swing.JDialog();
   356         jLabel18 = new javax.swing.JLabel();
   357         jLabel19 = new javax.swing.JLabel();
   358         jLabel17 = new javax.swing.JLabel();
   359         odpovedetKomuJmeno = new javax.swing.JTextField();
   360         odpovedetKomuAdresa = new javax.swing.JTextField();
   361         odpovedetKomuHotovo = new javax.swing.JButton();
   362         jXHeader1 = new org.jdesktop.swingx.JXHeader();
   363         taskPanel = new org.jdesktop.swingx.JXTaskPaneContainer();
   364         jXTaskPane1 = new org.jdesktop.swingx.JXTaskPane();
   365         lnText = new org.jdesktop.swingx.JXHyperlink();
   366         lnPrijemci = new org.jdesktop.swingx.JXHyperlink();
   367         lnOdeslat = new org.jdesktop.swingx.JXHyperlink();
   368         jXTaskPane2 = new org.jdesktop.swingx.JXTaskPane();
   369         lnServer = new org.jdesktop.swingx.JXHyperlink();
   370         lnDatabaze = new org.jdesktop.swingx.JXHyperlink();
   371         lnVychoziPrijemci = new org.jdesktop.swingx.JXHyperlink();
   372         panel = new org.jdesktop.swingx.JXPanel();
   373 
   374         jLabel9.setText("Databáze");
   375 
   376         jLabel10.setText("Jméno");
   377 
   378         jLabel11.setText("Heslo");
   379 
   380         vyzkousetPripojeniTlacitko.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/frantovo/superPostak/obrazky/fork.png"))); // NOI18N
   381         vyzkousetPripojeniTlacitko.setMnemonic('y');
   382         vyzkousetPripojeniTlacitko.setText("Vyzkoušet spojení");
   383         vyzkousetPripojeniTlacitko.addActionListener(new java.awt.event.ActionListener() {
   384             public void actionPerformed(java.awt.event.ActionEvent evt) {
   385                 vyzkousetPripojeniTlacitkoActionPerformed(evt);
   386             }
   387         });
   388 
   389         vystupDBzprava.setText(" ");
   390 
   391         javax.swing.GroupLayout panelDatabazeLayout = new javax.swing.GroupLayout(panelDatabaze);
   392         panelDatabaze.setLayout(panelDatabazeLayout);
   393         panelDatabazeLayout.setHorizontalGroup(
   394             panelDatabazeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
   395             .addGroup(panelDatabazeLayout.createSequentialGroup()
   396                 .addContainerGap()
   397                 .addGroup(panelDatabazeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
   398                     .addGroup(panelDatabazeLayout.createSequentialGroup()
   399                         .addGroup(panelDatabazeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
   400                             .addComponent(jLabel9)
   401                             .addComponent(jLabel10)
   402                             .addComponent(jLabel11))
   403                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
   404                         .addGroup(panelDatabazeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
   405                             .addComponent(vstupDatabaze, javax.swing.GroupLayout.DEFAULT_SIZE, 257, Short.MAX_VALUE)
   406                             .addComponent(vstupDBjmeno, javax.swing.GroupLayout.DEFAULT_SIZE, 257, Short.MAX_VALUE)
   407                             .addGroup(panelDatabazeLayout.createSequentialGroup()
   408                                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
   409                                 .addComponent(vstupDBheslo, javax.swing.GroupLayout.DEFAULT_SIZE, 257, Short.MAX_VALUE))))
   410                     .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelDatabazeLayout.createSequentialGroup()
   411                         .addComponent(vystupDBzprava, javax.swing.GroupLayout.DEFAULT_SIZE, 155, Short.MAX_VALUE)
   412                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
   413                         .addComponent(vyzkousetPripojeniTlacitko)))
   414                 .addContainerGap())
   415         );
   416         panelDatabazeLayout.setVerticalGroup(
   417             panelDatabazeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
   418             .addGroup(panelDatabazeLayout.createSequentialGroup()
   419                 .addContainerGap()
   420                 .addGroup(panelDatabazeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
   421                     .addComponent(jLabel9)
   422                     .addComponent(vstupDatabaze, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
   423                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
   424                 .addGroup(panelDatabazeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
   425                     .addComponent(jLabel10)
   426                     .addComponent(vstupDBjmeno, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
   427                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
   428                 .addGroup(panelDatabazeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
   429                     .addComponent(jLabel11)
   430                     .addComponent(vstupDBheslo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
   431                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
   432                 .addGroup(panelDatabazeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
   433                     .addComponent(vyzkousetPripojeniTlacitko)
   434                     .addComponent(vystupDBzprava))
   435                 .addContainerGap(183, Short.MAX_VALUE))
   436         );
   437 
   438         rozeslatZkusebniTlacitko.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/frantovo/superPostak/obrazky/apply.png"))); // NOI18N
   439         rozeslatZkusebniTlacitko.setMnemonic('u');
   440         rozeslatZkusebniTlacitko.setText("Rozeslat zkušební");
   441         rozeslatZkusebniTlacitko.addActionListener(new java.awt.event.ActionListener() {
   442             public void actionPerformed(java.awt.event.ActionEvent evt) {
   443                 rozeslatZkusebniTlacitkoActionPerformed(evt);
   444             }
   445         });
   446 
   447         rozeslatHromadnouZpravuTlacitko.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/frantovo/superPostak/obrazky/adept_commit.png"))); // NOI18N
   448         rozeslatHromadnouZpravuTlacitko.setMnemonic('h');
   449         rozeslatHromadnouZpravuTlacitko.setText("Rozeslat hromadnou zprávu");
   450         rozeslatHromadnouZpravuTlacitko.addActionListener(new java.awt.event.ActionListener() {
   451             public void actionPerformed(java.awt.event.ActionEvent evt) {
   452                 rozeslatHromadnouZpravuTlacitkoActionPerformed(evt);
   453             }
   454         });
   455 
   456         zobrazitVsechnyPrijemceTlacitko.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/frantovo/superPostak/obrazky/zobrazit_adresy.png"))); // NOI18N
   457         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>");
   458         zobrazitVsechnyPrijemceTlacitko.addActionListener(new java.awt.event.ActionListener() {
   459             public void actionPerformed(java.awt.event.ActionEvent evt) {
   460                 zobrazitVsechnyPrijemceTlacitkoActionPerformed(evt);
   461             }
   462         });
   463 
   464         javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
   465         jPanel1.setLayout(jPanel1Layout);
   466         jPanel1Layout.setHorizontalGroup(
   467             jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
   468             .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
   469                 .addContainerGap(106, Short.MAX_VALUE)
   470                 .addComponent(rozeslatZkusebniTlacitko)
   471                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
   472                 .addComponent(rozeslatHromadnouZpravuTlacitko)
   473                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
   474                 .addComponent(zobrazitVsechnyPrijemceTlacitko)
   475                 .addContainerGap())
   476         );
   477         jPanel1Layout.setVerticalGroup(
   478             jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
   479             .addGroup(jPanel1Layout.createSequentialGroup()
   480                 .addContainerGap()
   481                 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
   482                     .addComponent(rozeslatHromadnouZpravuTlacitko)
   483                     .addComponent(zobrazitVsechnyPrijemceTlacitko)
   484                     .addComponent(rozeslatZkusebniTlacitko))
   485                 .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
   486         );
   487 
   488         jLabel14.setText("Zkušební příjemci");
   489 
   490         javax.swing.GroupLayout panelOdeslatLayout = new javax.swing.GroupLayout(panelOdeslat);
   491         panelOdeslat.setLayout(panelOdeslatLayout);
   492         panelOdeslatLayout.setHorizontalGroup(
   493             panelOdeslatLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
   494             .addGroup(panelOdeslatLayout.createSequentialGroup()
   495                 .addContainerGap()
   496                 .addGroup(panelOdeslatLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
   497                     .addComponent(prijemciZkusebni, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 535, Short.MAX_VALUE)
   498                     .addComponent(jSeparator2, javax.swing.GroupLayout.DEFAULT_SIZE, 535, Short.MAX_VALUE)
   499                     .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
   500                     .addComponent(jLabel14))
   501                 .addContainerGap())
   502         );
   503         panelOdeslatLayout.setVerticalGroup(
   504             panelOdeslatLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
   505             .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelOdeslatLayout.createSequentialGroup()
   506                 .addContainerGap()
   507                 .addComponent(jLabel14)
   508                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
   509                 .addComponent(prijemciZkusebni, javax.swing.GroupLayout.DEFAULT_SIZE, 153, Short.MAX_VALUE)
   510                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
   511                 .addComponent(jSeparator2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
   512                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
   513                 .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
   514                 .addContainerGap())
   515         );
   516 
   517         jLabel13.setText("SQL dotaz");
   518 
   519         vstupSQL.setColumns(20);
   520         vstupSQL.setRows(5);
   521         jScrollPane3.setViewportView(vstupSQL);
   522 
   523         vyzkousetSQLTlacitko.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/frantovo/superPostak/obrazky/fork.png"))); // NOI18N
   524         vyzkousetSQLTlacitko.setMnemonic('y');
   525         vyzkousetSQLTlacitko.setText("Vyzkoušet");
   526         vyzkousetSQLTlacitko.addActionListener(new java.awt.event.ActionListener() {
   527             public void actionPerformed(java.awt.event.ActionEvent evt) {
   528                 vyzkousetSQLTlacitkoActionPerformed(evt);
   529             }
   530         });
   531 
   532         vystupSQLZprava.setText(" ");
   533 
   534         prijemciDodatecni.setToolTipText("Zde můžete dopnit další přijemce.");
   535 
   536         jLabel16.setText("Dodateční příjemci:");
   537 
   538         zobrazitSQLPrijemceTlacitko.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/frantovo/superPostak/obrazky/zobrazit_adresy.png"))); // NOI18N
   539         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>");
   540         zobrazitSQLPrijemceTlacitko.addActionListener(new java.awt.event.ActionListener() {
   541             public void actionPerformed(java.awt.event.ActionEvent evt) {
   542                 zobrazitSQLPrijemceTlacitkoActionPerformed(evt);
   543             }
   544         });
   545 
   546         javax.swing.GroupLayout panelPrijemciLayout = new javax.swing.GroupLayout(panelPrijemci);
   547         panelPrijemci.setLayout(panelPrijemciLayout);
   548         panelPrijemciLayout.setHorizontalGroup(
   549             panelPrijemciLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
   550             .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelPrijemciLayout.createSequentialGroup()
   551                 .addContainerGap()
   552                 .addGroup(panelPrijemciLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
   553                     .addComponent(prijemciDodatecni, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 344, Short.MAX_VALUE)
   554                     .addComponent(jSeparator1, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 344, Short.MAX_VALUE)
   555                     .addComponent(jScrollPane3, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 344, Short.MAX_VALUE)
   556                     .addComponent(jLabel13, javax.swing.GroupLayout.Alignment.LEADING)
   557                     .addGroup(panelPrijemciLayout.createSequentialGroup()
   558                         .addComponent(vystupSQLZprava, javax.swing.GroupLayout.DEFAULT_SIZE, 52, Short.MAX_VALUE)
   559                         .addGap(127, 127, 127)
   560                         .addComponent(vyzkousetSQLTlacitko)
   561                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
   562                         .addComponent(zobrazitSQLPrijemceTlacitko))
   563                     .addComponent(jLabel16, javax.swing.GroupLayout.Alignment.LEADING))
   564                 .addContainerGap())
   565         );
   566         panelPrijemciLayout.setVerticalGroup(
   567             panelPrijemciLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
   568             .addGroup(panelPrijemciLayout.createSequentialGroup()
   569                 .addContainerGap()
   570                 .addComponent(jLabel13)
   571                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
   572                 .addComponent(jScrollPane3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
   573                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
   574                 .addGroup(panelPrijemciLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
   575                     .addComponent(vystupSQLZprava, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE)
   576                     .addComponent(zobrazitSQLPrijemceTlacitko)
   577                     .addComponent(vyzkousetSQLTlacitko))
   578                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
   579                 .addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, 10, javax.swing.GroupLayout.PREFERRED_SIZE)
   580                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
   581                 .addComponent(jLabel16)
   582                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
   583                 .addComponent(prijemciDodatecni, javax.swing.GroupLayout.DEFAULT_SIZE, 200, Short.MAX_VALUE)
   584                 .addContainerGap())
   585         );
   586 
   587         jLabel4.setText("SMTP server");
   588 
   589         jLabel5.setText("Port");
   590 
   591         vstupSMTPserver.setText("localhost");
   592 
   593         vstupSMTPport.setValue(25);
   594 
   595         napovedaSMTP.setColumns(20);
   596         napovedaSMTP.setEditable(false);
   597         napovedaSMTP.setLineWrap(true);
   598         napovedaSMTP.setRows(5);
   599         napovedaSMTP.setText("Tip: některé SMTP servery mají omezený seznam počítačů, ze kterých přijímají poštu");
   600         napovedaSMTP.setWrapStyleWord(true);
   601         napovedaSMTPscroll.setViewportView(napovedaSMTP);
   602 
   603         jLabel6.setText("Jméno");
   604 
   605         jLabel7.setText("Heslo");
   606 
   607         vstupSMTPlimitPrijemcu.setValue(1000);
   608 
   609         jLabel8.setText("Limit příjemců");
   610 
   611         javax.swing.GroupLayout panelServerLayout = new javax.swing.GroupLayout(panelServer);
   612         panelServer.setLayout(panelServerLayout);
   613         panelServerLayout.setHorizontalGroup(
   614             panelServerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
   615             .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelServerLayout.createSequentialGroup()
   616                 .addContainerGap()
   617                 .addGroup(panelServerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
   618                     .addComponent(napovedaSMTPscroll, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 318, Short.MAX_VALUE)
   619                     .addGroup(panelServerLayout.createSequentialGroup()
   620                         .addGroup(panelServerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
   621                             .addComponent(jLabel4)
   622                             .addComponent(jLabel6)
   623                             .addComponent(jLabel5)
   624                             .addComponent(jLabel7)
   625                             .addComponent(jLabel8))
   626                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
   627                         .addGroup(panelServerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
   628                             .addComponent(vstupSMTPserver, javax.swing.GroupLayout.DEFAULT_SIZE, 230, Short.MAX_VALUE)
   629                             .addComponent(vstupSMTPport, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 230, Short.MAX_VALUE)
   630                             .addComponent(vstupSMTPjmeno, javax.swing.GroupLayout.DEFAULT_SIZE, 230, Short.MAX_VALUE)
   631                             .addComponent(vstupSMTPheslo, javax.swing.GroupLayout.DEFAULT_SIZE, 230, Short.MAX_VALUE)
   632                             .addComponent(vstupSMTPlimitPrijemcu, javax.swing.GroupLayout.DEFAULT_SIZE, 230, Short.MAX_VALUE))))
   633                 .addContainerGap())
   634         );
   635         panelServerLayout.setVerticalGroup(
   636             panelServerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
   637             .addGroup(panelServerLayout.createSequentialGroup()
   638                 .addContainerGap()
   639                 .addGroup(panelServerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
   640                     .addComponent(jLabel4)
   641                     .addComponent(vstupSMTPserver, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
   642                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
   643                 .addGroup(panelServerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
   644                     .addComponent(vstupSMTPport, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
   645                     .addComponent(jLabel5))
   646                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
   647                 .addGroup(panelServerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
   648                     .addComponent(jLabel6)
   649                     .addComponent(vstupSMTPjmeno, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
   650                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
   651                 .addGroup(panelServerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
   652                     .addComponent(vstupSMTPheslo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
   653                     .addComponent(jLabel7))
   654                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
   655                 .addGroup(panelServerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
   656                     .addComponent(vstupSMTPlimitPrijemcu, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
   657                     .addComponent(jLabel8))
   658                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
   659                 .addComponent(napovedaSMTPscroll, javax.swing.GroupLayout.DEFAULT_SIZE, 145, Short.MAX_VALUE)
   660                 .addContainerGap())
   661         );
   662 
   663         jLabel12.setText("Těmto lidem přijde hromadný e-mail vždy (netýká se zkušebního rozeslání zprávy).");
   664 
   665         javax.swing.GroupLayout panelVychoziPrijemciLayout = new javax.swing.GroupLayout(panelVychoziPrijemci);
   666         panelVychoziPrijemci.setLayout(panelVychoziPrijemciLayout);
   667         panelVychoziPrijemciLayout.setHorizontalGroup(
   668             panelVychoziPrijemciLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
   669             .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelVychoziPrijemciLayout.createSequentialGroup()
   670                 .addContainerGap()
   671                 .addGroup(panelVychoziPrijemciLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
   672                     .addComponent(prijemciVychozi, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 514, Short.MAX_VALUE)
   673                     .addComponent(jLabel12, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 514, Short.MAX_VALUE))
   674                 .addContainerGap())
   675         );
   676         panelVychoziPrijemciLayout.setVerticalGroup(
   677             panelVychoziPrijemciLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
   678             .addGroup(panelVychoziPrijemciLayout.createSequentialGroup()
   679                 .addContainerGap()
   680                 .addComponent(jLabel12)
   681                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
   682                 .addComponent(prijemciVychozi, javax.swing.GroupLayout.DEFAULT_SIZE, 261, Short.MAX_VALUE)
   683                 .addContainerGap())
   684         );
   685 
   686         jLabel1.setLabelFor(vstupPredmet);
   687         jLabel1.setText("Předmět");
   688 
   689         vstupPredmet.addActionListener(new java.awt.event.ActionListener() {
   690             public void actionPerformed(java.awt.event.ActionEvent evt) {
   691                 vstupPredmetActionPerformed(evt);
   692             }
   693         });
   694 
   695         jLabel2.setText("Jméno odesílatele");
   696 
   697         vstupZprava.setColumns(20);
   698         vstupZprava.setRows(5);
   699         jScrollPane1.setViewportView(vstupZprava);
   700 
   701         jLabel15.setText("Formát zprávy");
   702 
   703         vstupFormatHTML.setMnemonic('h');
   704         vstupFormatHTML.setText("HTML");
   705         vstupFormatHTML.setToolTipText("Při nezaškrtnutí se odešle jako prostý text");
   706 
   707         odpovedetKomuOdkaz.setForeground(javax.swing.UIManager.getDefaults().getColor("windowText"));
   708         odpovedetKomuOdkaz.setMnemonic('e');
   709         odpovedetKomuOdkaz.setText("Adresa odesílatele");
   710         odpovedetKomuOdkaz.setToolTipText("<html><p>Klikněte sem pro nastavení adresy,</p><p>na kterou mají chodit odpovědi</p></html>");
   711         odpovedetKomuOdkaz.setClickedColor(javax.swing.UIManager.getDefaults().getColor("windowText"));
   712         odpovedetKomuOdkaz.setUnclickedColor(javax.swing.UIManager.getDefaults().getColor("windowText"));
   713         odpovedetKomuOdkaz.addActionListener(new java.awt.event.ActionListener() {
   714             public void actionPerformed(java.awt.event.ActionEvent evt) {
   715                 odpovedetKomuOdkazActionPerformed(evt);
   716             }
   717         });
   718 
   719         javax.swing.GroupLayout panelZpravaLayout = new javax.swing.GroupLayout(panelZprava);
   720         panelZprava.setLayout(panelZpravaLayout);
   721         panelZpravaLayout.setHorizontalGroup(
   722             panelZpravaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
   723             .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelZpravaLayout.createSequentialGroup()
   724                 .addContainerGap()
   725                 .addGroup(panelZpravaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
   726                     .addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 438, Short.MAX_VALUE)
   727                     .addGroup(panelZpravaLayout.createSequentialGroup()
   728                         .addGroup(panelZpravaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
   729                             .addGroup(panelZpravaLayout.createSequentialGroup()
   730                                 .addGroup(panelZpravaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
   731                                     .addComponent(jLabel2)
   732                                     .addComponent(jLabel1))
   733                                 .addGap(17, 17, 17))
   734                             .addGroup(panelZpravaLayout.createSequentialGroup()
   735                                 .addComponent(odpovedetKomuOdkaz, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
   736                                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)))
   737                         .addGroup(panelZpravaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
   738                             .addComponent(vstupJmenoOdesilatele, javax.swing.GroupLayout.DEFAULT_SIZE, 328, Short.MAX_VALUE)
   739                             .addComponent(vstupAdresaOdesilatele, javax.swing.GroupLayout.DEFAULT_SIZE, 328, Short.MAX_VALUE)
   740                             .addComponent(vstupPredmet, javax.swing.GroupLayout.DEFAULT_SIZE, 328, Short.MAX_VALUE)))
   741                     .addGroup(javax.swing.GroupLayout.Alignment.LEADING, panelZpravaLayout.createSequentialGroup()
   742                         .addComponent(jLabel15)
   743                         .addGap(33, 33, 33)
   744                         .addComponent(vstupFormatHTML, javax.swing.GroupLayout.DEFAULT_SIZE, 81, Short.MAX_VALUE)
   745                         .addGap(247, 247, 247)))
   746                 .addContainerGap())
   747         );
   748         panelZpravaLayout.setVerticalGroup(
   749             panelZpravaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
   750             .addGroup(panelZpravaLayout.createSequentialGroup()
   751                 .addContainerGap()
   752                 .addGroup(panelZpravaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
   753                     .addComponent(jLabel1)
   754                     .addComponent(vstupPredmet, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
   755                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
   756                 .addGroup(panelZpravaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
   757                     .addComponent(jLabel2)
   758                     .addComponent(vstupJmenoOdesilatele, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
   759                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
   760                 .addGroup(panelZpravaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
   761                     .addComponent(vstupAdresaOdesilatele, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
   762                     .addComponent(odpovedetKomuOdkaz, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
   763                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
   764                 .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 184, Short.MAX_VALUE)
   765                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
   766                 .addGroup(panelZpravaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
   767                     .addComponent(jLabel15)
   768                     .addComponent(vstupFormatHTML))
   769                 .addContainerGap())
   770         );
   771 
   772         odpovedetKomuDialog.setTitle("Adresa pro odpovědi");
   773         odpovedetKomuDialog.setModal(true);
   774 
   775         jLabel18.setText("Jméno");
   776 
   777         jLabel19.setText("Adresa");
   778 
   779         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>");
   780 
   781         odpovedetKomuHotovo.setText("Hotovo");
   782         odpovedetKomuHotovo.addActionListener(new java.awt.event.ActionListener() {
   783             public void actionPerformed(java.awt.event.ActionEvent evt) {
   784                 odpovedetKomuHotovoActionPerformed(evt);
   785             }
   786         });
   787 
   788         javax.swing.GroupLayout odpovedetKomuDialogLayout = new javax.swing.GroupLayout(odpovedetKomuDialog.getContentPane());
   789         odpovedetKomuDialog.getContentPane().setLayout(odpovedetKomuDialogLayout);
   790         odpovedetKomuDialogLayout.setHorizontalGroup(
   791             odpovedetKomuDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
   792             .addGroup(odpovedetKomuDialogLayout.createSequentialGroup()
   793                 .addContainerGap()
   794                 .addGroup(odpovedetKomuDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
   795                     .addGroup(odpovedetKomuDialogLayout.createSequentialGroup()
   796                         .addGroup(odpovedetKomuDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
   797                             .addComponent(jLabel19)
   798                             .addComponent(jLabel18))
   799                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
   800                         .addGroup(odpovedetKomuDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
   801                             .addComponent(odpovedetKomuAdresa, javax.swing.GroupLayout.DEFAULT_SIZE, 332, Short.MAX_VALUE)
   802                             .addComponent(odpovedetKomuJmeno, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 332, Short.MAX_VALUE)))
   803                     .addComponent(jLabel17, javax.swing.GroupLayout.DEFAULT_SIZE, 382, Short.MAX_VALUE)
   804                     .addComponent(odpovedetKomuHotovo, javax.swing.GroupLayout.Alignment.TRAILING))
   805                 .addContainerGap())
   806         );
   807         odpovedetKomuDialogLayout.setVerticalGroup(
   808             odpovedetKomuDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
   809             .addGroup(odpovedetKomuDialogLayout.createSequentialGroup()
   810                 .addContainerGap()
   811                 .addGroup(odpovedetKomuDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
   812                     .addComponent(jLabel18)
   813                     .addComponent(odpovedetKomuJmeno, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
   814                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
   815                 .addGroup(odpovedetKomuDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
   816                     .addComponent(jLabel19)
   817                     .addComponent(odpovedetKomuAdresa, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
   818                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
   819                 .addComponent(jLabel17)
   820                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
   821                 .addComponent(odpovedetKomuHotovo)
   822                 .addContainerGap())
   823         );
   824 
   825         setTitle("SuperPošťák");
   826         addWindowListener(new java.awt.event.WindowAdapter() {
   827             public void windowClosing(java.awt.event.WindowEvent evt) {
   828                 formWindowClosing(evt);
   829             }
   830         });
   831 
   832         jXHeader1.setDescription("Program pro posílání hromadných zpráv elektronickou poštou.\nNezneužívejte pro rozesílání spamu.");
   833         jXHeader1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/frantovo/superPostak/obrazky/xfmail.png"))); // NOI18N
   834         jXHeader1.setTitle("SuperPošťák");
   835 
   836         taskPanel.setBackground(javax.swing.UIManager.getDefaults().getColor("Button.background"));
   837 
   838         jXTaskPane1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/frantovo/superPostak/obrazky/mail_generic.png"))); // NOI18N
   839         jXTaskPane1.setTitle("Hromadná zpráva");
   840 
   841         lnText.setMnemonic('z');
   842         lnText.setText("Text zprávy");
   843         lnText.setActionCommand("Zpráva");
   844         lnText.addActionListener(new java.awt.event.ActionListener() {
   845             public void actionPerformed(java.awt.event.ActionEvent evt) {
   846                 lnTextActionPerformed(evt);
   847             }
   848         });
   849         jXTaskPane1.getContentPane().add(lnText);
   850 
   851         lnPrijemci.setMnemonic('p');
   852         lnPrijemci.setText("Příjemci");
   853         lnPrijemci.addActionListener(new java.awt.event.ActionListener() {
   854             public void actionPerformed(java.awt.event.ActionEvent evt) {
   855                 lnPrijemciActionPerformed(evt);
   856             }
   857         });
   858         jXTaskPane1.getContentPane().add(lnPrijemci);
   859 
   860         lnOdeslat.setMnemonic('o');
   861         lnOdeslat.setText("Odeslat");
   862         lnOdeslat.addActionListener(new java.awt.event.ActionListener() {
   863             public void actionPerformed(java.awt.event.ActionEvent evt) {
   864                 lnOdeslatActionPerformed(evt);
   865             }
   866         });
   867         jXTaskPane1.getContentPane().add(lnOdeslat);
   868 
   869         taskPanel.add(jXTaskPane1);
   870 
   871         jXTaskPane2.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/frantovo/superPostak/obrazky/gear.png"))); // NOI18N
   872         jXTaskPane2.setTitle("Nastavení");
   873 
   874         lnServer.setMnemonic('s');
   875         lnServer.setText("Poštovní server");
   876         lnServer.addActionListener(new java.awt.event.ActionListener() {
   877             public void actionPerformed(java.awt.event.ActionEvent evt) {
   878                 lnServerActionPerformed(evt);
   879             }
   880         });
   881         jXTaskPane2.getContentPane().add(lnServer);
   882 
   883         lnDatabaze.setMnemonic('d');
   884         lnDatabaze.setText("Databáze");
   885         lnDatabaze.addActionListener(new java.awt.event.ActionListener() {
   886             public void actionPerformed(java.awt.event.ActionEvent evt) {
   887                 lnDatabazeActionPerformed(evt);
   888             }
   889         });
   890         jXTaskPane2.getContentPane().add(lnDatabaze);
   891 
   892         lnVychoziPrijemci.setMnemonic('v');
   893         lnVychoziPrijemci.setText("Výchozí příjemci");
   894         lnVychoziPrijemci.addActionListener(new java.awt.event.ActionListener() {
   895             public void actionPerformed(java.awt.event.ActionEvent evt) {
   896                 lnVychoziPrijemciActionPerformed(evt);
   897             }
   898         });
   899         jXTaskPane2.getContentPane().add(lnVychoziPrijemci);
   900 
   901         taskPanel.add(jXTaskPane2);
   902 
   903         panel.setLayout(new java.awt.CardLayout());
   904 
   905         javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
   906         getContentPane().setLayout(layout);
   907         layout.setHorizontalGroup(
   908             layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
   909             .addGroup(layout.createSequentialGroup()
   910                 .addComponent(taskPanel, javax.swing.GroupLayout.PREFERRED_SIZE, 196, javax.swing.GroupLayout.PREFERRED_SIZE)
   911                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
   912                 .addComponent(panel, javax.swing.GroupLayout.DEFAULT_SIZE, 342, Short.MAX_VALUE))
   913             .addComponent(jXHeader1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 544, Short.MAX_VALUE)
   914         );
   915         layout.setVerticalGroup(
   916             layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
   917             .addGroup(layout.createSequentialGroup()
   918                 .addComponent(jXHeader1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
   919                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
   920                 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
   921                     .addComponent(taskPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 340, Short.MAX_VALUE)
   922                     .addComponent(panel, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 340, Short.MAX_VALUE)))
   923         );
   924 
   925         pack();
   926     }// </editor-fold>//GEN-END:initComponents
   927     private void vstupPredmetActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_vstupPredmetActionPerformed
   928 }//GEN-LAST:event_vstupPredmetActionPerformed
   929 
   930     private void lnTextActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_lnTextActionPerformed
   931 		setPanel(panelZprava);
   932     }//GEN-LAST:event_lnTextActionPerformed
   933 
   934     private void lnPrijemciActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_lnPrijemciActionPerformed
   935 		setPanel(panelPrijemci);
   936     }//GEN-LAST:event_lnPrijemciActionPerformed
   937 
   938     private void lnOdeslatActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_lnOdeslatActionPerformed
   939 		setPanel(panelOdeslat);
   940     }//GEN-LAST:event_lnOdeslatActionPerformed
   941 
   942     private void lnServerActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_lnServerActionPerformed
   943 		setPanel(panelServer);
   944     }//GEN-LAST:event_lnServerActionPerformed
   945 
   946     private void lnDatabazeActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_lnDatabazeActionPerformed
   947 		setPanel(panelDatabaze);
   948     }//GEN-LAST:event_lnDatabazeActionPerformed
   949 
   950     private void lnVychoziPrijemciActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_lnVychoziPrijemciActionPerformed
   951 		setPanel(panelVychoziPrijemci);
   952     }//GEN-LAST:event_lnVychoziPrijemciActionPerformed
   953 
   954     private void formWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosing
   955 		ulozNastaveni();
   956 		log.log(Level.WARNING, "Ukončuji program.");
   957     }//GEN-LAST:event_formWindowClosing
   958 
   959 	/**
   960 	 * Sestaví zprávu na základě GUI vstupů. Všechno kromě příjemců,
   961 	 * ti se přidají až dodatečně, podle toho,
   962 	 * jestli jde o zkušební nebo skutečné rozesílání.
   963 	 */
   964 	private HromadnaZprava getZprava() throws UnsupportedEncodingException {
   965 		HromadnaZprava zprava = new HromadnaZprava();
   966 		zprava.setOdesilatel(new InternetAddress(vstupAdresaOdesilatele.getText(), vstupJmenoOdesilatele.getText()));
   967 		zprava.setPredmet(vstupPredmet.getText());
   968 		zprava.setText(vstupZprava.getText());
   969 		zprava.setFormatHTML(vstupFormatHTML.isSelected());
   970 
   971 		if (Postak.zkontrolujAdresu(odpovedetKomuAdresa.getText())) {
   972 			InternetAddress komu = new InternetAddress();
   973 			komu.setPersonal(odpovedetKomuJmeno.getText());
   974 			komu.setAddress(odpovedetKomuAdresa.getText());
   975 			zprava.setOdpovedetKomu(komu);
   976 		}
   977 
   978 		return zprava;
   979 	}
   980 
   981 	/** Všichni příjemci, kterým bude odeslána ostrá zpráva. */
   982 	private ArrayList<InternetAddressKomu> getPrijemciVsichni() throws SQLException, UnsupportedEncodingException {
   983 		ArrayList<InternetAddressKomu> vsichni = new ArrayList<InternetAddressKomu>();
   984 		Collection<InternetAddressKomu> adresyVychozi = nastaveni.getVychoziPrijemci();
   985 		Collection<InternetAddressKomu> adresySQL = getPrijemciSQL();
   986 		Collection<InternetAddressKomu> adresyDodatecne = prijemciDodatecni.getAdresy();
   987 
   988 		if (adresyVychozi != null) {
   989 			vsichni.addAll(adresyVychozi);
   990 		}
   991 		if (adresySQL != null) {
   992 			vsichni.addAll(adresySQL);
   993 		}
   994 		if (adresyDodatecne != null) {
   995 			vsichni.addAll(adresyDodatecne);
   996 		}
   997 		return vsichni;
   998 	}
   999 
  1000     private void rozeslatHromadnouZpravuTlacitkoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_rozeslatHromadnouZpravuTlacitkoActionPerformed
  1001 		try {
  1002 			ulozNastaveniGUI();
  1003 			HromadnaZprava zprava = getZprava();
  1004 			zprava.setPrijemci(getPrijemciVsichni());
  1005 
  1006 			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);
  1007 			if (volba == JOptionPane.YES_OPTION) {
  1008 				odesli(zprava);
  1009 				Postak.vypisPrijemce(zprava.getPrijemci());
  1010 				zobrazInformacniDialog("Odesláno", "Zpráva byla odeslána.\nPočet příjemců: " + zprava.getPrijemci().size(), true);
  1011 			}
  1012 		} catch (Exception e) {
  1013 			zobrazChybovyDialog("Zprávu se nepodařilo odeslat", e, Level.SEVERE, true);
  1014 		}
  1015 }//GEN-LAST:event_rozeslatHromadnouZpravuTlacitkoActionPerformed
  1016 
  1017     private void rozeslatZkusebniTlacitkoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_rozeslatZkusebniTlacitkoActionPerformed
  1018 		try {
  1019 			ulozNastaveniGUI();
  1020 			HromadnaZprava zprava = getZprava();
  1021 			zprava.setPrijemci(prijemciZkusebni.getAdresy());
  1022 
  1023 			odesli(zprava);
  1024 
  1025 			zobrazInformacniDialog("Odesláno", "Zkušební zpráva byla odeslána.\nPočet adresátů: " + zprava.getPrijemci().size(), true);
  1026 		} catch (Exception e) {
  1027 			zobrazChybovyDialog("Zkušební zprávu se nepodařilo odeslat", e, Level.SEVERE, true);
  1028 		}
  1029     }//GEN-LAST:event_rozeslatZkusebniTlacitkoActionPerformed
  1030 
  1031     private void vyzkousetPripojeniTlacitkoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_vyzkousetPripojeniTlacitkoActionPerformed
  1032 		try {
  1033             getSpojeni();//GEN-LAST:event_vyzkousetPripojeniTlacitkoActionPerformed
  1034 			zobrazInformacniDialog("Připojeno k DB", "Připojení k DB proběhlo úspěšně", false);
  1035 		} catch (SQLException e) {
  1036 			zobrazChybovyDialog("Spojení s DB", "Připojení k databázi selhalo", null, e, Level.SEVERE, true);
  1037 		}
  1038 	}
  1039 
  1040     private void vyzkousetSQLTlacitkoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_vyzkousetSQLTlacitkoActionPerformed
  1041 		try {
  1042             Collection<InternetAddressKomu> adresy = getPrijemciSQL();//GEN-LAST:event_vyzkousetSQLTlacitkoActionPerformed
  1043 			if (adresy == null) {
  1044 				zobrazInformacniDialog("SQL dotaz", "Dotaz do databáze neproběhl.\nSQL dotaz je prázdný.", false);
  1045 			} else {
  1046 				zobrazInformacniDialog("SQL dotaz", "Dotaz do databáze byl úspěšný.\nPočet získaných záznamů: " + adresy.size(), false);
  1047 			}
  1048 		} catch (Exception e) {
  1049 			zobrazChybovyDialog("SQL dotaz", "Provedení SQL příkazu selhalo selhalo", null, e, Level.SEVERE, true);
  1050 		}
  1051 	}
  1052 
  1053     private void zobrazitSQLPrijemceTlacitkoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_zobrazitSQLPrijemceTlacitkoActionPerformed
  1054 		try {
  1055 			Collection<InternetAddressKomu> adresy = getPrijemciSQL();
  1056 
  1057 			ZobrazovacAdres zobrazovac = new ZobrazovacAdres(this, false);
  1058 			zobrazovac.setNastaveni(nastaveni);
  1059 			zobrazovac.setAdresy(adresy);
  1060 			zobrazovac.setLocationRelativeTo(this);
  1061 			zobrazovac.setVisible(true);
  1062 
  1063 		} catch (Exception e) {
  1064 			zobrazChybovyDialog("SQL dotaz", "Provedení SQL příkazu selhalo selhalo", null, e, Level.SEVERE, true);
  1065 		}
  1066     }//GEN-LAST:event_zobrazitSQLPrijemceTlacitkoActionPerformed
  1067 
  1068     private void zobrazitVsechnyPrijemceTlacitkoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_zobrazitVsechnyPrijemceTlacitkoActionPerformed
  1069 		try {
  1070 			Collection<InternetAddressKomu> adresy = getPrijemciVsichni();
  1071 
  1072 			ZobrazovacAdres zobrazovac = new ZobrazovacAdres(this, false);
  1073 			zobrazovac.setAdresy(adresy);
  1074 			zobrazovac.setLocationRelativeTo(this);
  1075 			zobrazovac.setVisible(true);
  1076 
  1077 		} catch (Exception e) {
  1078 			zobrazChybovyDialog("SQL dotaz", "Provedení SQL příkazu selhalo selhalo", null, e, Level.SEVERE, true);
  1079 		}
  1080     }//GEN-LAST:event_zobrazitVsechnyPrijemceTlacitkoActionPerformed
  1081 
  1082     private void odpovedetKomuOdkazActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_odpovedetKomuOdkazActionPerformed
  1083 		odpovedetKomuDialog.pack();
  1084 		odpovedetKomuDialog.setLocationRelativeTo(this);
  1085 		odpovedetKomuDialog.setModalityType(ModalityType.APPLICATION_MODAL);
  1086 		odpovedetKomuDialog.getRootPane().setDefaultButton(odpovedetKomuHotovo);
  1087 		odpovedetKomuDialog.setVisible(true);
  1088 }//GEN-LAST:event_odpovedetKomuOdkazActionPerformed
  1089 
  1090     private void odpovedetKomuHotovoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_odpovedetKomuHotovoActionPerformed
  1091 		odpovedetKomuDialog.setVisible(false);
  1092 
  1093 		if (vstupJmenoOdesilatele.getText().isEmpty()) {
  1094 			vstupJmenoOdesilatele.setText(odpovedetKomuJmeno.getText());
  1095 		}
  1096 
  1097 		if (vstupAdresaOdesilatele.getText().isEmpty()) {
  1098 			String[] částiAdresy = odpovedetKomuAdresa.getText().split("@");
  1099 			if (částiAdresy.length == 2) {
  1100 				vstupAdresaOdesilatele.setText("noreply@" + částiAdresy[1]);
  1101 			}
  1102 		}
  1103 }//GEN-LAST:event_odpovedetKomuHotovoActionPerformed
  1104 
  1105 	/** Provede uživatelem zadaný SQL dotaz a vrátí získané příjemce */
  1106 	private Collection<InternetAddressKomu> getPrijemciSQL() throws SQLException, UnsupportedEncodingException {
  1107 		if ("".equals(vstupSQL.getText())) {
  1108 			return null;
  1109 		} else {
  1110 			return getSpojeni().getAdresy(vstupSQL.getText());
  1111 		}
  1112 	}
  1113 
  1114 	private DataSQL getSpojeni() throws SQLException {
  1115 		return Data.getSpojeniSQL(vstupDatabaze.getText(), vstupDBjmeno.getText(), vstupDBheslo.getPassword());
  1116 	}
  1117 
  1118 	/** Obalovací třída, která v průběhu odesílání zobrazuje kurzor s hodinami. */
  1119 	private void odesli(HromadnaZprava zprava) throws MessagingException {
  1120 		setCursor(new Cursor(Cursor.WAIT_CURSOR));
  1121 		try {
  1122 			postak.setNastaveni(nastaveni);
  1123 			postak.odesli(zprava);
  1124 
  1125 		} catch (MessagingException e) {
  1126 			throw e;
  1127 		} finally {
  1128 			setCursor(Cursor.getDefaultCursor());
  1129 		}
  1130 	}
  1131 
  1132 	private void setPanel(JComponent komponenta) {
  1133 
  1134 		if (panel.getLayout() instanceof CardLayout) {
  1135 			CardLayout l = (CardLayout) panel.getLayout();
  1136 			l.show(panel, komponenta.getName());
  1137 		} else {
  1138 			log.log(Level.WARNING, "Neplatí: panel.getLayout() instanceof CardLayout");
  1139 		}
  1140 
  1141 	}
  1142 
  1143 	/** Změní chování tabulátoru v textovém poli - aby se pomocí TABu dalo skočit na další komponentu */
  1144 	private void vyresitTabFocusProblem(JTextArea textArea) {
  1145 		textArea.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, null);
  1146 		textArea.setFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS, null);
  1147 	}
  1148 
  1149 	public JXTaskPaneContainer getTaskPanel() {
  1150 		return taskPanel;
  1151 	}
  1152 
  1153 	/**
  1154 	 * @param args the command line arguments
  1155 	 */
  1156 	public static void main(String args[]) {
  1157 		final boolean ladit = (args != null && args.length > 0 && args[0].equals("ladit"));
  1158 
  1159 		try {
  1160 			//LookAndFeel laf = UIManager.getLookAndFeel();
  1161 
  1162 			//laf = new SubstanceLookAndFeel();
  1163 			//laf = new SubstanceBusinessLookAndFeel();
  1164 			//laf = new SubstanceBusinessBlueSteelLookAndFeel();
  1165 			//laf = new SubstanceBusinessBlackSteelLookAndFeel();
  1166 
  1167 			UIManager.setLookAndFeel("org.jvnet.substance.skin.SubstanceBusinessBlueSteelLookAndFeel");
  1168 		} catch (ClassNotFoundException ex) {
  1169 			log.log(Level.SEVERE, null, ex);
  1170 		} catch (InstantiationException ex) {
  1171 			log.log(Level.SEVERE, null, ex);
  1172 		} catch (IllegalAccessException ex) {
  1173 			log.log(Level.SEVERE, null, ex);
  1174 		} catch (UnsupportedLookAndFeelException ex) {
  1175 			log.log(Level.SEVERE, null, ex);
  1176 		}
  1177 
  1178 		java.awt.EventQueue.invokeLater(new Runnable() {
  1179 
  1180 			public void run() {
  1181 				new SuperPostak(ladit, true).setVisible(true);
  1182 			}
  1183 		});
  1184 	}
  1185     // Variables declaration - do not modify//GEN-BEGIN:variables
  1186     private javax.swing.JLabel jLabel1;
  1187     private javax.swing.JLabel jLabel10;
  1188     private javax.swing.JLabel jLabel11;
  1189     private javax.swing.JLabel jLabel12;
  1190     private javax.swing.JLabel jLabel13;
  1191     private javax.swing.JLabel jLabel14;
  1192     private javax.swing.JLabel jLabel15;
  1193     private javax.swing.JLabel jLabel16;
  1194     private javax.swing.JLabel jLabel17;
  1195     private javax.swing.JLabel jLabel18;
  1196     private javax.swing.JLabel jLabel19;
  1197     private javax.swing.JLabel jLabel2;
  1198     private javax.swing.JLabel jLabel4;
  1199     private javax.swing.JLabel jLabel5;
  1200     private javax.swing.JLabel jLabel6;
  1201     private javax.swing.JLabel jLabel7;
  1202     private javax.swing.JLabel jLabel8;
  1203     private javax.swing.JLabel jLabel9;
  1204     private javax.swing.JPanel jPanel1;
  1205     private javax.swing.JScrollPane jScrollPane1;
  1206     private javax.swing.JScrollPane jScrollPane3;
  1207     private javax.swing.JSeparator jSeparator1;
  1208     private javax.swing.JSeparator jSeparator2;
  1209     private org.jdesktop.swingx.JXHeader jXHeader1;
  1210     private org.jdesktop.swingx.JXTaskPane jXTaskPane1;
  1211     private org.jdesktop.swingx.JXTaskPane jXTaskPane2;
  1212     private org.jdesktop.swingx.JXHyperlink lnDatabaze;
  1213     private org.jdesktop.swingx.JXHyperlink lnOdeslat;
  1214     private org.jdesktop.swingx.JXHyperlink lnPrijemci;
  1215     private org.jdesktop.swingx.JXHyperlink lnServer;
  1216     private org.jdesktop.swingx.JXHyperlink lnText;
  1217     private org.jdesktop.swingx.JXHyperlink lnVychoziPrijemci;
  1218     private javax.swing.JTextArea napovedaSMTP;
  1219     private javax.swing.JScrollPane napovedaSMTPscroll;
  1220     private javax.swing.JTextField odpovedetKomuAdresa;
  1221     private javax.swing.JDialog odpovedetKomuDialog;
  1222     private javax.swing.JButton odpovedetKomuHotovo;
  1223     private javax.swing.JTextField odpovedetKomuJmeno;
  1224     private org.jdesktop.swingx.JXHyperlink odpovedetKomuOdkaz;
  1225     private org.jdesktop.swingx.JXPanel panel;
  1226     private org.jdesktop.swingx.JXPanel panelDatabaze;
  1227     private org.jdesktop.swingx.JXPanel panelOdeslat;
  1228     private org.jdesktop.swingx.JXPanel panelPrijemci;
  1229     private org.jdesktop.swingx.JXPanel panelServer;
  1230     private org.jdesktop.swingx.JXPanel panelVychoziPrijemci;
  1231     private org.jdesktop.swingx.JXPanel panelZprava;
  1232     private cz.frantovo.superPostak.PanelPrijemcu prijemciDodatecni;
  1233     private cz.frantovo.superPostak.PanelPrijemcu prijemciVychozi;
  1234     private cz.frantovo.superPostak.PanelPrijemcu prijemciZkusebni;
  1235     private javax.swing.JButton rozeslatHromadnouZpravuTlacitko;
  1236     private javax.swing.JButton rozeslatZkusebniTlacitko;
  1237     private org.jdesktop.swingx.JXTaskPaneContainer taskPanel;
  1238     private javax.swing.JTextField vstupAdresaOdesilatele;
  1239     private javax.swing.JPasswordField vstupDBheslo;
  1240     private javax.swing.JTextField vstupDBjmeno;
  1241     private javax.swing.JTextField vstupDatabaze;
  1242     private javax.swing.JCheckBox vstupFormatHTML;
  1243     private javax.swing.JTextField vstupJmenoOdesilatele;
  1244     private javax.swing.JTextField vstupPredmet;
  1245     private javax.swing.JPasswordField vstupSMTPheslo;
  1246     private javax.swing.JTextField vstupSMTPjmeno;
  1247     private javax.swing.JSpinner vstupSMTPlimitPrijemcu;
  1248     private javax.swing.JSpinner vstupSMTPport;
  1249     private javax.swing.JTextField vstupSMTPserver;
  1250     private javax.swing.JTextArea vstupSQL;
  1251     private javax.swing.JTextArea vstupZprava;
  1252     private javax.swing.JLabel vystupDBzprava;
  1253     private javax.swing.JLabel vystupSQLZprava;
  1254     private javax.swing.JButton vyzkousetPripojeniTlacitko;
  1255     private javax.swing.JButton vyzkousetSQLTlacitko;
  1256     private javax.swing.JButton zobrazitSQLPrijemceTlacitko;
  1257     private javax.swing.JButton zobrazitVsechnyPrijemceTlacitko;
  1258     // End of variables declaration//GEN-END:variables
  1259 }