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