# HG changeset patch # User František Kučera # Date 1227475160 -3600 # Node ID e76872ad522636de0e5437fd711fc3a70d623c89 Přidání SuperPošťáka do Mercurialu (původně byl v Subversionu) Postak – základ, knihovna SuperPostak – GUI nadstavba SuperPostak2 – pokus o implementaci aplikace jako modulu pro Netbeans, POZOR: není přidán do Mercurialu, možná později (pravděpodobně se ale nebude používat) diff -r 000000000000 -r e76872ad5226 .hgignore --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/.hgignore Sun Nov 23 22:19:20 2008 +0100 @@ -0,0 +1,9 @@ +java/Postak/dist/* +java/Postak/build/* + +java/SuperPostak/dist/* +java/SuperPostak/build/* + +java/SuperPostak2/* +java/SuperPostak2/dist/* +java/SuperPostak2/build/* diff -r 000000000000 -r e76872ad5226 java/Postak/nbproject/build-impl.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/java/Postak/nbproject/build-impl.xml Sun Nov 23 22:19:20 2008 +0100 @@ -0,0 +1,629 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must set src.dir + Must set test.src.dir + Must set build.dir + Must set dist.dir + Must set build.classes.dir + Must set dist.javadoc.dir + Must set build.test.classes.dir + Must set build.test.results.dir + Must set build.classes.excludes + Must set dist.jar + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must set javac.includes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must select some files in the IDE or set javac.includes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + To run this application from the command line without Ant, try: + + + + + + + java -cp "${run.classpath.with.dist.jar}" ${main.class} + + + + + + + + + + + + + + + + + + + + + + + To run this application from the command line without Ant, try: + + java -jar "${dist.jar.resolved}" + + + + + + + + + + + + + + + + + + + Must select one file in the IDE or set run.class + + + + + + + + + + + + + + + + + + + + Must select one file in the IDE or set debug.class + + + + + Must set fix.includes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must select some files in the IDE or set javac.includes + + + + + + + + + + + + + + + + + + + + Some tests failed; see details above. + + + + + + + + + Must select some files in the IDE or set test.includes + + + + Some tests failed; see details above. + + + + + Must select one file in the IDE or set test.class + + + + + + + + + + + + + + + + + + + + + + + + + + + Must select one file in the IDE or set applet.url + + + + + + + + + Must select one file in the IDE or set applet.url + + + + + + + + + + + + + + + + + + + diff -r 000000000000 -r e76872ad5226 java/Postak/nbproject/genfiles.properties --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/java/Postak/nbproject/genfiles.properties Sun Nov 23 22:19:20 2008 +0100 @@ -0,0 +1,8 @@ +build.xml.data.CRC32=ecce8ba0 +build.xml.script.CRC32=b613dcff +build.xml.stylesheet.CRC32=be360661 +# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. +# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. +nbproject/build-impl.xml.data.CRC32=ecce8ba0 +nbproject/build-impl.xml.script.CRC32=38f4cab2 +nbproject/build-impl.xml.stylesheet.CRC32=487672f9 diff -r 000000000000 -r e76872ad5226 java/Postak/nbproject/private/private.properties --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/java/Postak/nbproject/private/private.properties Sun Nov 23 22:19:20 2008 +0100 @@ -0,0 +1,6 @@ +do.depend=false +do.jar=true +javac.debug=true +javadoc.preview=true +jaxws.endorsed.dir=/usr/local/netbeans-6.1/java2/modules/ext/jaxws21/api +user.properties.file=/home/fiki/.netbeans/6.1/build.properties diff -r 000000000000 -r e76872ad5226 java/Postak/nbproject/project.properties --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/java/Postak/nbproject/project.properties Sun Nov 23 22:19:20 2008 +0100 @@ -0,0 +1,67 @@ +application.title=Postak +application.vendor=fiki +build.classes.dir=${build.dir}/classes +build.classes.excludes=**/*.java,**/*.form +# This directory is removed when the project is cleaned: +build.dir=build +build.generated.dir=${build.dir}/generated +# Only compile against the classpath explicitly listed here: +build.sysclasspath=ignore +build.test.classes.dir=${build.dir}/test/classes +build.test.results.dir=${build.dir}/test/results +debug.classpath=\ + ${run.classpath} +debug.test.classpath=\ + ${run.test.classpath} +# This directory is removed when the project is cleaned: +dist.dir=dist +dist.jar=${dist.dir}/Postak.jar +dist.javadoc.dir=${dist.dir}/javadoc +excludes= +includes=** +jar.compress=false +javac.classpath=\ + ${libs.JAF.classpath}:\ + ${libs.JavaMail.classpath} +# Space-separated list of extra javac options +javac.compilerargs= +javac.deprecation=false +javac.source=1.5 +javac.target=1.5 +javac.test.classpath=\ + ${javac.classpath}:\ + ${build.classes.dir}:\ + ${libs.junit.classpath}:\ + ${libs.junit_4.classpath} +javadoc.additionalparam= +javadoc.author=false +javadoc.encoding=${source.encoding} +javadoc.noindex=false +javadoc.nonavbar=false +javadoc.notree=false +javadoc.private=false +javadoc.splitindex=true +javadoc.use=true +javadoc.version=false +javadoc.windowtitle= +# Property libs.JAF.classpath is set here just to make sharing of project simpler. +# The library definition has always preference over this property. +libs.JAF.classpath=../../../../../java/lib/jaf/jaf-1.1.1/activation.jar +# Property libs.JavaMail.classpath is set here just to make sharing of project simpler. +# The library definition has always preference over this property. +libs.JavaMail.classpath=../../../../../java/lib/java-mail/javamail-1.4.1/mail.jar:../../../../../java/lib/java-mail/javamail-1.4.1/lib/dsn.jar:../../../../../java/lib/java-mail/javamail-1.4.1/lib/imap.jar:../../../../../java/lib/java-mail/javamail-1.4.1/lib/mailapi.jar:../../../../../java/lib/java-mail/javamail-1.4.1/lib/pop3.jar:../../../../../java/lib/java-mail/javamail-1.4.1/lib/smtp.jar +meta.inf.dir=${src.dir}/META-INF +platform.active=default_platform +run.classpath=\ + ${javac.classpath}:\ + ${build.classes.dir} +# Space-separated list of JVM arguments used when running the project +# (you may also define separate properties like run-sys-prop.name=value instead of -Dname=value +# or test-sys-prop.name=value to set system properties for unit tests): +run.jvmargs= +run.test.classpath=\ + ${javac.test.classpath}:\ + ${build.test.classes.dir} +source.encoding=UTF-8 +src.dir=src +test.src.dir=test diff -r 000000000000 -r e76872ad5226 java/Postak/nbproject/project.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/java/Postak/nbproject/project.xml Sun Nov 23 22:19:20 2008 +0100 @@ -0,0 +1,16 @@ + + + org.netbeans.modules.java.j2seproject + + + Postak + 1.6.5 + + + + + + + + + diff -r 000000000000 -r e76872ad5226 java/Postak/src/cz/frantovo/postak/HromadnaZprava.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/java/Postak/src/cz/frantovo/postak/HromadnaZprava.java Sun Nov 23 22:19:20 2008 +0100 @@ -0,0 +1,138 @@ +package cz.frantovo.postak; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.mail.internet.InternetAddress; + +/** + * Hromadná zpráva. Umí se rozdělit i na více dílčích zpráv, + * které se vejdou do limitu příjemců SMTP serveru. + * @author fiki + */ +public class HromadnaZprava implements Cloneable { + + private static Logger log = Logger.getLogger(HromadnaZprava.class.getName()); + /** Předmět zprávy */ + private String predmet; + /** Adresa a případně jméno odesílatele */ + private InternetAddress odesilatel; + /** Zda má být zpráva odeslána jako HTML nebo prostý text */ + private boolean formatHTML = false; + /** Tělo zprávy - prostý text */ + private String text; + /** Všichni příjemci této zprávy */ + private ArrayList prijemci = new ArrayList(); + /** Hlavička Reply-to */ + private InternetAddress odpovedetKomu; + + public String getPredmet() { + return predmet; + } + + public void setPredmet(String predmet) { + this.predmet = predmet; + } + + public InternetAddress getOdesilatel() { + return odesilatel; + } + + public void setOdesilatel(InternetAddress odesilatel) { + this.odesilatel = odesilatel; + } + + public String getText() { + return text; + } + + public void setText(String text) { + this.text = text; + } + + public ArrayList getPrijemci() { + return prijemci; + } + + /** + * @param prijemci pokud je null, nastaví prázdná kolekce. + */ + public void setPrijemci(ArrayList prijemci) { + this.prijemci = new ArrayList(); + pridejPrijemce(prijemci); + } + + public void pridejPrijemce(Collection prijemci) { + if (prijemci == null) { + log.log(Level.FINER, "Prázdná množina příjemců - nic nepřidáme"); + } else { + this.prijemci.addAll(prijemci); + } + } + + /** + * Pokud má zpráva více přijemců, než je limit povolený SMTP serverem, + * rozdělí se zpráva na více dílčích zpráv. + * @param limit maximální počet příjemců jedné zprávy (omezení SMTP serveru) + */ + public Collection getDilciZpravy(int limit) { + Collection zpravy = new ArrayList(); + + if (limit < getPrijemci().size()) { + /** Zprávu je potřeba rozdělit */ + try { + HromadnaZprava dilciZprava = (HromadnaZprava) clone(); + dilciZprava.setPrijemci(null); + + ArrayList vsichniPrijemci = getPrijemci(); + for (InternetAddressKomu prijemce : vsichniPrijemci) { + dilciZprava.getPrijemci().add(prijemce); + + if (dilciZprava.getPrijemci().size() == limit) { + zpravy.add(dilciZprava); + dilciZprava = (HromadnaZprava) clone(); + dilciZprava.setPrijemci(null); + } + } + + if (dilciZprava.getPrijemci().size() > 0) { + /** + * Počet příjemců není násobkem limitu, + * takže nakonci ještě někteří zbyli. + * Z nich budou příjemci pro poslední dílčí zprávu. + */ + zpravy.add(dilciZprava); + } + + + } catch (CloneNotSupportedException ex) { + /** Tohle by nikdy nemělo nastat */ + log.log(Level.SEVERE, "Hromandou zprávu se nepodařilo naklonovat - divné.", ex); + zpravy.add(this); + } + } else { + /** Zprávu má málo příjemců - můžeme ji odeslat najednou */ + zpravy.add(this); + } + + return zpravy; + } + + public boolean isFormatHTML() { + return formatHTML; + } + + public void setFormatHTML(boolean formatHTML) { + this.formatHTML = formatHTML; + } + + public InternetAddress getOdpovedetKomu() { + return odpovedetKomu; + } + + /** Pokud je null, hlavička Reply-to se v e-mailu vůbec nenastaví. */ + public void setOdpovedetKomu(InternetAddress odpovedetKomu) { + this.odpovedetKomu = odpovedetKomu; + } +} diff -r 000000000000 -r e76872ad5226 java/Postak/src/cz/frantovo/postak/InternetAddressKomu.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/java/Postak/src/cz/frantovo/postak/InternetAddressKomu.java Sun Nov 23 22:19:20 2008 +0100 @@ -0,0 +1,54 @@ +package cz.frantovo.postak; + +import java.io.UnsupportedEncodingException; +import javax.mail.Message.RecipientType; +import javax.mail.internet.InternetAddress; + +/** + * Rozšíření InternetAddress tak, aby obsahovala i informaci o typu příjemce: komu, kopie, skrytá + * @author fiki + */ +public class InternetAddressKomu extends InternetAddress { + + private RecipientType typ = RecipientType.BCC; + + /** + * Typ příjemce: komu, kopie, skrytý. + * Výchozí hodnota je BCC + */ + public RecipientType getTyp() { + return typ; + } + + /** + * Typ příjemce: komu, kopie, skrytý. + * Výchozí hodnota je BCC + */ + public void setTyp(RecipientType typ) { + this.typ = typ; + } + + @Override + public String getPersonal() { + String sup = super.getPersonal(); + if (sup == null || sup.length() < 1) { + return getAddress(); + } else { + return sup; + } + } + + public InternetAddressKomu() { + super(); + } + + /** Výchozí typ příjemce: skrytá kopie */ + public InternetAddressKomu(String adresa, String jmeno) throws UnsupportedEncodingException { + super(adresa, jmeno); + } + + public InternetAddressKomu(String adresa, String jmeno, RecipientType typ) throws UnsupportedEncodingException { + super(adresa, jmeno); + setTyp(typ); + } +} diff -r 000000000000 -r e76872ad5226 java/Postak/src/cz/frantovo/postak/Nastaveni.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/java/Postak/src/cz/frantovo/postak/Nastaveni.java Sun Nov 23 22:19:20 2008 +0100 @@ -0,0 +1,114 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +package cz.frantovo.postak; + +import java.util.ArrayList; + +/** + * + * @author fiki + */ +public class Nastaveni { + + private String postovniServer = "localhost"; + private int postovniPort = 25; + private String postovniJmeno; + private char[] postovniHeslo; + private int limitZprav = 1000; + + /** Připojovací řetězec */ + private String databaze; + private String dbJmeno; + private char[] dbHeslo; + + /** Výchozí příjemci */ + private ArrayList vychoziPrijemci; + + /** Přejatá konstanta od SuperPošťáka */ + private String cestaKCertifikatum; + + public String getCestaKCertifikatum() { + return cestaKCertifikatum; + } + + public void setCestaKCertifikatum(String cestaKCertifikatum) { + this.cestaKCertifikatum = cestaKCertifikatum; + } + + public String getPostovniServer() { + return postovniServer; + } + + public void setPostovniServer(String postovniServer) { + this.postovniServer = postovniServer; + } + + public int getPostovniPort() { + return postovniPort; + } + + public void setPostovniPort(int postovniPort) { + this.postovniPort = postovniPort; + } + + public String getPostovniJmeno() { + return postovniJmeno; + } + + public void setPostovniJmeno(String postovniJmeno) { + this.postovniJmeno = postovniJmeno; + } + + public char[] getPostovniHeslo() { + return postovniHeslo; + } + + public void setPostovniHeslo(char[] postovniHeslo) { + this.postovniHeslo = postovniHeslo; + } + + public int getLimitZprav() { + return limitZprav; + } + + public void setLimitZprav(int limitZprav) { + this.limitZprav = limitZprav; + } + + public String getDatabaze() { + return databaze; + } + + public String getDbJmeno() { + return dbJmeno; + } + + public char[] getDbHeslo() { + return dbHeslo; + } + + public ArrayList getVychoziPrijemci() { + return vychoziPrijemci; + } + + public void setDatabaze(String databaze) { + this.databaze = databaze; + } + + public void setDbJmeno(String dbJmeno) { + this.dbJmeno = dbJmeno; + } + + public void setDbHeslo(char[] dbHeslo) { + this.dbHeslo = dbHeslo; + } + + public void setVychoziPrijemci(ArrayList vychoziPrijemci) { + this.vychoziPrijemci = vychoziPrijemci; + } + + +} diff -r 000000000000 -r e76872ad5226 java/Postak/src/cz/frantovo/postak/Postak.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/java/Postak/src/cz/frantovo/postak/Postak.java Sun Nov 23 22:19:20 2008 +0100 @@ -0,0 +1,221 @@ +package cz.frantovo.postak; + +import java.io.File; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Properties; +import java.util.logging.Level; +import java.util.logging.Logger; +import java.util.regex.Pattern; +import javax.mail.Address; +import javax.mail.Authenticator; +import javax.mail.MessagingException; +import javax.mail.PasswordAuthentication; +import javax.mail.Session; +import javax.mail.Transport; +import javax.mail.internet.MimeMessage; + +/** + * Odešle hromadnou zprávu pomocí SMTP. + * + * @author fiki + */ +public class Postak { + + private static Logger log = Logger.getLogger(Postak.class.getName()); + /** Regulární výraz pro správnou e-mailovou adresu */ + private static String REGULARNI_EMAIL = "^[_a-zA-Z0-9\\.\\-]+@[_a-zA-Z0-9\\.\\-]+\\.[a-zA-Z]{2,4}$"; + + private Nastaveni nastaveni; + + public Postak(Nastaveni nastaveni) { + this.nastaveni = nastaveni; + } + + public void setNastaveni(Nastaveni nastaveni) { + this.nastaveni = nastaveni; + } + + /** + * Nízkoúrovňová odesílací metoda, která už nekontroluje limit příjemců. + * Pokud se nevejdou do limitu SMTP serveru, vyhazuje výjimku. + * + * TODO: lepší to bude nestaické - nastavení si vyžádat v konstruktoru + */ + private void odesliSMTP(HromadnaZprava zprava) throws MessagingException { + + if (zkontrolujZpravu(zprava) && zkontrolujNastaveni(nastaveni)) { + + /** Inicializace SMTP */ + Properties smtpVlastnosti = System.getProperties(); + smtpVlastnosti.put("mail.smtp.host", nastaveni.getPostovniServer()); + smtpVlastnosti.put("mail.smtp.port", String.valueOf(nastaveni.getPostovniPort())); + + if (nastaveni.getPostovniPort() == 465) { + if (new File(nastaveni.getCestaKCertifikatum()).exists()) { + System.setProperty("javax.net.ssl.trustStore", nastaveni.getCestaKCertifikatum()); + log.log(Level.INFO, "Používám vlastní důvěryhodné certifikáty: " + nastaveni.getCestaKCertifikatum()); + } + /** TODO: neřídit se číslem portu, ale přidat příznak pro šifrování */ + smtpVlastnosti.put("mail.smtp.starttls.enable", "true"); + smtpVlastnosti.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); + smtpVlastnosti.put("mail.smtp.socketFactory.port", String.valueOf(nastaveni.getPostovniPort())); + smtpVlastnosti.put("mail.smtp.socketFactory.fallback", "false"); + /** + * NAHRÁNÍ CERTIFIKÁTU: + * 1) stáhneme si certifikát (---BEGIN CERTIFICATE---) a uložíme do vse_ca.cer + * 2) keytool -importcert -file vse_ca.cer -keystore DuveryhodneCertifikaty.keystore -storepass "changeit" + * Pokud daný soubor existuje, program ho používá, pokud ne, používá certifikáty uložené v systému (Javovské). + */ + } + + PostakuvHeslovnik heslovnik = new PostakuvHeslovnik(); + if (nastaveni.getPostovniJmeno() != null && nastaveni.getPostovniJmeno().length() > 0) { + heslovnik.setJmenoHeslo(nastaveni.getPostovniJmeno(), nastaveni.getPostovniHeslo()); + smtpVlastnosti.put("mail.smtp.auth", "true"); + log.log(Level.FINEST, "Používám pro SMTP jméno a heslo"); + } + + Session smtpRelace = Session.getInstance(smtpVlastnosti, heslovnik); + + smtpRelace.setDebug(true); + smtpRelace.setDebugOut(System.out); + + /** Sestavení zprávy */ + MimeMessage mimeZprava = new MimeMessage(smtpRelace); + mimeZprava.setFrom(zprava.getOdesilatel()); + if (zprava.getOdpovedetKomu() != null) { + Address[] odpovedetKomu = {zprava.getOdpovedetKomu()}; + mimeZprava.setReplyTo(odpovedetKomu); + } + naplnPrijemce(mimeZprava, zprava); + mimeZprava.setSubject(zprava.getPredmet()); + mimeZprava.setHeader("User-Agent", "http://frantovo.cz/projekty/SuperPostak/"); + if (zprava.isFormatHTML()) { + mimeZprava.setText(zprava.getText(), "UTF-8", "html"); + } else { + mimeZprava.setText(zprava.getText(), "UTF-8"); + } + + /** Vlastní odeslání */ + Transport.send(mimeZprava); + + } else { + MessagingException e = new MessagingException("Zpráva nebo nastavení jsou nevyhovující"); + log.log(Level.SEVERE, null, e); + throw e; + } + + } + + /** + * Nastaví zprávě (MimeMessage) všechny příjemce, které najde ve zprávě a nastavení. + * Respektuje typy příjemců: komu, kopie, skrytá kopie. + */ + private static void naplnPrijemce(MimeMessage mimeZprava, HromadnaZprava zprava) throws MessagingException { + /** + * Příjemci se budou definovat pouze ve zprávě. + * Z nastavení se brát nebudou (výchozí příjemci už ve zprávě budou). + */ + ArrayList prijemci = zprava.getPrijemci(); + for (InternetAddressKomu komu : prijemci) { + if (zkontrolujAdresu(komu)) { + mimeZprava.addRecipient(komu.getTyp(), komu); + } + } + } + + /** Vypíše do logu seznam příjemců */ + public static void vypisPrijemce(Collection prijemci) { + for (InternetAddressKomu p : prijemci) { + log.log(Level.INFO, p.toString()); + } + } + + /** Veřejná odesílací metoda. + * Postará se o rozdělení zpráv na dílčí (které se vejdou do limitu příjemců) + */ + public void odesli(HromadnaZprava zprava) throws MessagingException { + Collection zpravy = zprava.getDilciZpravy(nastaveni.getLimitZprav()); + + for (HromadnaZprava dilciZprava : zpravy) { + odesliSMTP(dilciZprava); + } + } + + private static boolean zkontrolujAdresu(InternetAddressKomu a) { + if (a.getTyp() == null) { + log.log(Level.WARNING, "Neplatná adresa (typ): " + a.getAddress()); + return false; + } + + if (a.getAddress() == null || a.getAddress().length() < 1) { + log.log(Level.WARNING, "Neplatná adresa (address): " + a.getPersonal()); + return false; + } + + if (!zkontrolujAdresu(a.getAddress())) { + log.log(Level.WARNING, "Adresa nevyhovuje regulárnímu výrazu: " + a.getAddress()); + return false; + } + + return true; + } + + /** Zkontroluje e-mailovou adresu pomocí regulárního výrazu. */ + public static boolean zkontrolujAdresu(String adresa) { + return adresa != null && Pattern.matches(REGULARNI_EMAIL, adresa); + } + + /** @return Vrací true, pokud je zpráva v pořádku */ + private static boolean zkontrolujZpravu(HromadnaZprava z) { + + if (z.getPrijemci() == null) { + log.log(Level.WARNING, "getPrijemci() == null"); + return false; + } + + if (z.getPrijemci().size() < 1) { + log.log(Level.WARNING, "getPrijemci().size() < 1"); + return false; + } + + if (z.getOdesilatel() == null) { + log.log(Level.WARNING, "getOdesilatel() == null"); + return false; + } + + if (z.getPredmet() == null) { + log.log(Level.WARNING, "getPredmet() == null"); + return false; + } + + return true; + } + + private static boolean zkontrolujNastaveni(Nastaveni n) { + + if (n.getPostovniServer() == null || n.getPostovniServer().length() < 1) { + return false; + } + + return true; + } + + /** Slouží k uložení jména a hesla pro SMTP */ + private static class PostakuvHeslovnik extends Authenticator { + + private String jmeno = "user"; + private char[] heslo = "luser".toCharArray(); + + @Override + public PasswordAuthentication getPasswordAuthentication() { + return new PasswordAuthentication(jmeno, String.valueOf(heslo)); + } + + public void setJmenoHeslo(String jmeno, char[] heslo) { + this.jmeno = jmeno; + this.heslo = heslo; + } + } +} diff -r 000000000000 -r e76872ad5226 java/SuperPostak/manifest.mf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/java/SuperPostak/manifest.mf Sun Nov 23 22:19:20 2008 +0100 @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +X-COMMENT: Main-Class will be added automatically by build + diff -r 000000000000 -r e76872ad5226 java/SuperPostak/master.jnlp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/java/SuperPostak/master.jnlp Sun Nov 23 22:19:20 2008 +0100 @@ -0,0 +1,21 @@ + + + + ${APPLICATION.TITLE} + ${APPLICATION.VENDOR} + ${APPLICATION.DESC} + ${APPLICATION.DESC.SHORT} + + + + + + + + + + + + + + diff -r 000000000000 -r e76872ad5226 java/SuperPostak/nbproject/build-impl.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/java/SuperPostak/nbproject/build-impl.xml Sun Nov 23 22:19:20 2008 +0100 @@ -0,0 +1,636 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must set src.dir + Must set test.src.dir + Must set build.dir + Must set dist.dir + Must set build.classes.dir + Must set dist.javadoc.dir + Must set build.test.classes.dir + Must set build.test.results.dir + Must set build.classes.excludes + Must set dist.jar + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must set javac.includes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must select some files in the IDE or set javac.includes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + To run this application from the command line without Ant, try: + + + + + + + java -cp "${run.classpath.with.dist.jar}" ${main.class} + + + + + + + + + + + + + + + + + + + + + + + To run this application from the command line without Ant, try: + + java -jar "${dist.jar.resolved}" + + + + + + + + + + + + + + + + + + + Must select one file in the IDE or set run.class + + + + + + + + + + + + + + + + + + + + Must select one file in the IDE or set debug.class + + + + + Must set fix.includes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must select some files in the IDE or set javac.includes + + + + + + + + + + + + + + + + + + + + Some tests failed; see details above. + + + + + + + + + Must select some files in the IDE or set test.includes + + + + Some tests failed; see details above. + + + + + Must select one file in the IDE or set test.class + + + + + + + + + + + + + + + + + + + + + + + + + + + Must select one file in the IDE or set applet.url + + + + + + + + + Must select one file in the IDE or set applet.url + + + + + + + + + + + + + + + + + + + + + + diff -r 000000000000 -r e76872ad5226 java/SuperPostak/nbproject/configs/JWS_generated.properties --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/java/SuperPostak/nbproject/configs/JWS_generated.properties Sun Nov 23 22:19:20 2008 +0100 @@ -0,0 +1,4 @@ +#Sun Dec 09 02:37:31 CET 2007 +$label=Web Start +$target.debug=jws-debug +$target.run=jws-run diff -r 000000000000 -r e76872ad5226 java/SuperPostak/nbproject/genfiles.properties --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/java/SuperPostak/nbproject/genfiles.properties Sun Nov 23 22:19:20 2008 +0100 @@ -0,0 +1,8 @@ +build.xml.data.CRC32=d917048a +build.xml.script.CRC32=bda184ca +build.xml.stylesheet.CRC32=be360661 +# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. +# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. +nbproject/build-impl.xml.data.CRC32=d917048a +nbproject/build-impl.xml.script.CRC32=5446e5b9 +nbproject/build-impl.xml.stylesheet.CRC32=487672f9 diff -r 000000000000 -r e76872ad5226 java/SuperPostak/nbproject/jnlp-impl.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/java/SuperPostak/nbproject/jnlp-impl.xml Sun Nov 23 22:19:20 2008 +0100 @@ -0,0 +1,453 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $${APPLICATION.TITLE} + $${APPLICATION.VENDOR} + $${APPLICATION.DESC} + $${APPLICATION.DESC.SHORT} + + + + + + + + + + + + + + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Test page for launching the application via JNLP + + +

Test page for launching the application via JNLP

+ Launch the application + + +]]>
+
+ +
diff -r 000000000000 -r e76872ad5226 java/SuperPostak/nbproject/private/private.properties --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/java/SuperPostak/nbproject/private/private.properties Sun Nov 23 22:19:20 2008 +0100 @@ -0,0 +1,8 @@ +do.depend=false +do.jar=true +javac.debug=true +javadoc.preview=true +jaxws.endorsed.dir=/home/fiki/bin/netbeans-6.1/java2/modules/ext/jaxws21/api +project.JFTable=/home/fiki/subversion/JFTable/trunk/java/JFTable +project.Postak=/home/fiki/subversion/SuperPostak/trunk/java/Postak +user.properties.file=/home/fiki/.netbeans/6.1/build.properties diff -r 000000000000 -r e76872ad5226 java/SuperPostak/nbproject/private/private.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/java/SuperPostak/nbproject/private/private.xml Sun Nov 23 22:19:20 2008 +0100 @@ -0,0 +1,4 @@ + + + + diff -r 000000000000 -r e76872ad5226 java/SuperPostak/nbproject/project.properties --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/java/SuperPostak/nbproject/project.properties Sun Nov 23 22:19:20 2008 +0100 @@ -0,0 +1,101 @@ +application.title=SuperPostak +application.vendor=fiki +build.classes.dir=${build.dir}/classes +build.classes.excludes=**/*.java,**/*.form +# This directory is removed when the project is cleaned: +build.dir=build +build.generated.dir=${build.dir}/generated +# Only compile against the classpath explicitly listed here: +build.sysclasspath=ignore +build.test.classes.dir=${build.dir}/test/classes +build.test.results.dir=${build.dir}/test/results +debug.classpath=\ + ${run.classpath} +debug.test.classpath=\ + ${run.test.classpath} +# This directory is removed when the project is cleaned: +dist.dir=dist +dist.jar=${dist.dir}/SuperPostak.jar +dist.javadoc.dir=${dist.dir}/javadoc +excludes= +includes=** +jar.compress=false +javac.classpath=\ + ${libs.PostgreSQLDriver.classpath}:\ + ${libs.SwingX.classpath}:\ + ${libs.JAF.classpath}:\ + ${libs.JavaMail.classpath}:\ + ${libs.SubstanceLaF.classpath}:\ + ${reference.JFTable.jar}:\ + ${libs.MySQLDriver.classpath}:\ + ${libs.jTDS-Sybase-MSSQL.classpath}:\ + ${libs.Sybase.com.classpath}:\ + ${reference.Postak.jar} +# Space-separated list of extra javac options +javac.compilerargs= +javac.deprecation=false +javac.source=1.5 +javac.target=1.5 +javac.test.classpath=\ + ${javac.classpath}:\ + ${build.classes.dir}:\ + ${libs.junit_4.classpath} +javadoc.additionalparam= +javadoc.author=false +javadoc.encoding=${source.encoding} +javadoc.noindex=false +javadoc.nonavbar=false +javadoc.notree=false +javadoc.private=false +javadoc.splitindex=true +javadoc.use=true +javadoc.version=false +javadoc.windowtitle= +jnlp.codebase.type=user +jnlp.codebase.url=file:/home/fiki/subversion/SuperPostak/trunk/java/SuperPostak/dist/ +jnlp.codebase.user=http://frantovo.cz/projekty/SuperPostak/jws/ +jnlp.enabled=true +jnlp.icon=/home/fiki/java/SuperPostak/src/cz/frantovo/superPostak/mail_generic.png +jnlp.offline-allowed=true +jnlp.signed=true +# Property libs.JAF.classpath is set here just to make sharing of project simpler. +# The library definition has always preference over this property. +libs.JAF.classpath=../lib/jaf/jaf-1.1.1/activation.jar +# Property libs.JavaMail.classpath is set here just to make sharing of project simpler. +# The library definition has always preference over this property. +libs.JavaMail.classpath=../lib/java-mail/javamail-1.4.1/mail.jar:../lib/java-mail/javamail-1.4.1/lib/dsn.jar:../lib/java-mail/javamail-1.4.1/lib/imap.jar:../lib/java-mail/javamail-1.4.1/lib/mailapi.jar:../lib/java-mail/javamail-1.4.1/lib/pop3.jar:../lib/java-mail/javamail-1.4.1/lib/smtp.jar +# Property libs.jTDS-Sybase-MSSQL.classpath is set here just to make sharing of project simpler. +# The library definition has always preference over this property. +libs.jTDS-Sybase-MSSQL.classpath=../../../../../java/lib/jTDS - Sybase a MS SQL/jtds-1.2.2-dist/jtds-1.2.2.jar +# Property libs.MySQLDriver.classpath is set here just to make sharing of project simpler. +# The library definition has always preference over this property. +libs.MySQLDriver.classpath=../../../../../../../usr/local/netbeans-6.0/ide8/modules/ext/mysql-connector-java-5.0.7-bin.jar +# Property libs.PostgreSQLDriver.classpath is set here just to make sharing of project simpler. +# The library definition has always preference over this property. +libs.PostgreSQLDriver.classpath=../../../../usr/local/netbeans-6.0/ide8/modules/ext/postgresql-8.2-506.jdbc3.jar +# Property libs.SubstanceLaF.classpath is set here just to make sharing of project simpler. +# The library definition has always preference over this property. +libs.SubstanceLaF.classpath=../../../../../java/lib/substance/lib/asm-all-2.2.2.jar:../../../../../java/lib/substance/lib/forms-1.1.0.jar:../../../../../java/lib/substance/lib/laf-plugin-50.jar:../../../../../java/lib/substance/lib/laf-widget.jar:../../../../../java/lib/substance/lib/substance-baseline.jar:../../../../../java/lib/substance/lib/substance-swingx.jar:../../../../../java/lib/substance/lib/substance-watermark-pack.jar:../../../../../java/lib/substance/lib/swingx.jar:../../../../../java/lib/substance/build/classes +# Property libs.SwingX.classpath is set here just to make sharing of project simpler. +# The library definition has always preference over this property. +libs.SwingX.classpath=../lib/swingx/SwingX 0.9.1/swingx/dist/swingx-0.9.1.jar:../lib/swingx/SwingX 0.9.1/swingx/lib/jmock-1.1.0RC1.jar:../lib/swingx/SwingX 0.9.1/swingx/lib/junit-4.0-src.jar:../lib/swingx/SwingX 0.9.1/swingx/lib/junit-4.0.jar:../lib/swingx/SwingX 0.9.1/swingx/lib/optional/Filters.jar:../lib/swingx/SwingX 0.9.1/swingx/lib/optional/MultipleGradientPaint.jar:../lib/swingx/SwingX 0.9.1/swingx/lib/optional/swing-layout.jar:../lib/swingx/SwingX 0.9.1/swingx/lib/optional/swing-worker.jar +# Property libs.Sybase.com.classpath is set here just to make sharing of project simpler. +# The library definition has always preference over this property. +libs.Sybase.com.classpath=../../../../../java/lib/Sybase.com/jconn2.jar:../../../../../java/lib/Sybase.com/jTDS2.jar +main.class=cz.frantovo.superPostak.SuperPostak +manifest.file=manifest.mf +meta.inf.dir=${src.dir}/META-INF +platform.active=default_platform +project.JFTable=../../../../JFTable/trunk/java/JFTable +project.Postak=../Postak +reference.JFTable.jar=${project.JFTable}/dist/JFTable.jar +reference.Postak.jar=${project.Postak}/dist/Postak.jar +run.classpath=\ + ${javac.classpath}:\ + ${build.classes.dir} +run.test.classpath=\ + ${javac.test.classpath}:\ + ${build.test.classes.dir} +source.encoding=UTF-8 +src.dir=src +test.src.dir=test diff -r 000000000000 -r e76872ad5226 java/SuperPostak/nbproject/project.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/java/SuperPostak/nbproject/project.xml Sun Nov 23 22:19:20 2008 +0100 @@ -0,0 +1,39 @@ + + + org.netbeans.modules.java.j2seproject + + + + + + + + SuperPostak + 1.6.5 + + + + + + + + + + JFTable + jar + + jar + clean + jar + + + Postak + jar + + jar + clean + jar + + + + diff -r 000000000000 -r e76872ad5226 java/SuperPostak/src/cz/frantovo/superPostak/Data.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/java/SuperPostak/src/cz/frantovo/superPostak/Data.java Sun Nov 23 22:19:20 2008 +0100 @@ -0,0 +1,76 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ +package cz.frantovo.superPostak; + +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; +import java.util.Arrays; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * Vrstva pro připojení k databázi + * @author fiki + */ +public class Data { + + private static Logger log = Logger.getLogger(Data.class.getName()); + private static Connection spojeni; + private static byte[] hash; + private static MessageDigest sha; + + public static synchronized DataSQL getSpojeniSQL(String url, String jmeno, char[] heslo) throws SQLException { + return new DataSQL(getSpojeni(url, jmeno, heslo)); + } + + private static synchronized Connection getSpojeni(String url, String jmeno, char[] heslo) throws SQLException { + if (Arrays.equals(hash, hashuj(url, jmeno, heslo)) && spojeni != null && !spojeni.isClosed()) { + log.log(Level.INFO, "Znovupoužívám DB spojení."); + } else { + spojeni = getNoveSpojeni(url, jmeno, heslo); + } + + return spojeni; + } + + private static Connection getNoveSpojeni( + String url, String jmeno, char[] heslo) throws SQLException { + /** Pokusíme se uzavřít staré spojení */ + if (spojeni != null && !spojeni.isClosed()) { + try { + spojeni.close(); + } catch (Exception e) { + log.log(Level.INFO, "Nepodařilo se uzavřít spojení", e); + } + } + + /** Vrátíme nové spojení */ + hash = hashuj(url, jmeno, heslo); + spojeni = DriverManager.getConnection(url, jmeno, String.valueOf(heslo)); + log.log(Level.INFO, "Otevřeno nové spoejní spojení k databázi: " + url); + return spojeni; + } + + private static byte[] hashuj(String url, String jmeno, char[] heslo) { + try { + if (sha == null) { + sha = MessageDigest.getInstance("SHA-256"); + } + String text = url + "/" + jmeno + "/" + String.valueOf(heslo); + return sha.digest(text.getBytes()); + + } catch (NoSuchAlgorithmException e) { + /** Tohle by nemělo nikdy nastat. V nouzovém případě použijeme součet hodnot místo hashe. */ + log.log(Level.SEVERE, "Neexistující hashovací algoritmus", e); + String soucet = url + "/" + jmeno + String.valueOf(heslo).length(); + return soucet.getBytes(); + } + } +} + + diff -r 000000000000 -r e76872ad5226 java/SuperPostak/src/cz/frantovo/superPostak/DataSQL.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/java/SuperPostak/src/cz/frantovo/superPostak/DataSQL.java Sun Nov 23 22:19:20 2008 +0100 @@ -0,0 +1,50 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ +package cz.frantovo.superPostak; + +import cz.frantovo.postak.InternetAddressKomu; +import java.io.UnsupportedEncodingException; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * Třída pro vykonávání SQL dotazů + * @author fiki + */ +public class DataSQL { + + private static Logger log = Logger.getLogger(DataSQL.class.getName()); + private Connection spojeni; + + public DataSQL(Connection spojeni) { + this.spojeni = spojeni; + } + + /** + * Provede SQL příkaz a získá z něj e-mailové adresy. + * Zatím předpokládá pouze jediný sloupec, který obsahuje adresu. + */ + public Collection getAdresy(String sql) throws SQLException, UnsupportedEncodingException { + ArrayList vysledek = new ArrayList(); + + if (sql == null || sql.length() < 3) { + log.log(Level.FINER, "Prázdný SQL dotaz"); + return null; + } else { + PreparedStatement ps = spojeni.prepareStatement(sql); + ResultSet rs = ps.executeQuery(); + while (rs.next()) { + vysledek.add(new InternetAddressKomu(rs.getString(1), rs.getString(1))); + } + return vysledek; + } + } +} diff -r 000000000000 -r e76872ad5226 java/SuperPostak/src/cz/frantovo/superPostak/GrafPokus.form --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/java/SuperPostak/src/cz/frantovo/superPostak/GrafPokus.form Sun Nov 23 22:19:20 2008 +0100 @@ -0,0 +1,58 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff -r 000000000000 -r e76872ad5226 java/SuperPostak/src/cz/frantovo/superPostak/GrafPokus.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/java/SuperPostak/src/cz/frantovo/superPostak/GrafPokus.java Sun Nov 23 22:19:20 2008 +0100 @@ -0,0 +1,90 @@ +/* + * GrafPokus.java + * + * Created on 7. prosinec 2007, 22:33 + */ + +package cz.frantovo.superPostak; + +import java.awt.Color; +import org.jdesktop.swingx.JXGraph.Plot; + +/** + * + * @author fiki + */ +public class GrafPokus extends javax.swing.JFrame { + + /** Creates new form GrafPokus */ + public GrafPokus() { + initComponents(); + + mujGraf.addPlots(Color.GREEN, new Plot(){ + + @Override + public double compute(double value) { + return value * value; + } + + }); + } + + /** This method is called from within the constructor to + * initialize the form. + * WARNING: Do NOT modify this code. The content of this method is + * always regenerated by the Form Editor. + */ + // //GEN-BEGIN:initComponents + private void initComponents() { + + mujGraf = new org.jdesktop.swingx.JXGraph(); + + setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); + + javax.swing.GroupLayout mujGrafLayout = new javax.swing.GroupLayout(mujGraf); + mujGraf.setLayout(mujGrafLayout); + mujGrafLayout.setHorizontalGroup( + mujGrafLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 465, Short.MAX_VALUE) + ); + mujGrafLayout.setVerticalGroup( + mujGrafLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 422, Short.MAX_VALUE) + ); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addComponent(mujGraf, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addContainerGap()) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addComponent(mujGraf, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addContainerGap()) + ); + + pack(); + }// //GEN-END:initComponents + + /** + * @param args the command line arguments + */ + public static void main(String args[]) { + java.awt.EventQueue.invokeLater(new Runnable() { + public void run() { + new GrafPokus().setVisible(true); + } + }); + } + + // Variables declaration - do not modify//GEN-BEGIN:variables + private org.jdesktop.swingx.JXGraph mujGraf; + // End of variables declaration//GEN-END:variables + +} diff -r 000000000000 -r e76872ad5226 java/SuperPostak/src/cz/frantovo/superPostak/PanelPrijemcu.form --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/java/SuperPostak/src/cz/frantovo/superPostak/PanelPrijemcu.form Sun Nov 23 22:19:20 2008 +0100 @@ -0,0 +1,119 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
diff -r 000000000000 -r e76872ad5226 java/SuperPostak/src/cz/frantovo/superPostak/PanelPrijemcu.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/java/SuperPostak/src/cz/frantovo/superPostak/PanelPrijemcu.java Sun Nov 23 22:19:20 2008 +0100 @@ -0,0 +1,341 @@ +package cz.frantovo.superPostak; + +import cz.frantovo.gui.tabulky.TableSorterModel; +import cz.frantovo.postak.InternetAddressKomu; +import cz.frantovo.postak.Postak; +import java.awt.Cursor; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.OutputStreamWriter; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.swing.DefaultListSelectionModel; +import javax.swing.JFileChooser; +import javax.swing.event.TableModelEvent; +import javax.swing.event.TableModelListener; +import javax.swing.table.TableModel; + +/** + * + * @author fiki + */ +public class PanelPrijemcu extends javax.swing.JPanel { + + private static Logger log = Logger.getLogger(PanelPrijemcu.class.getName()); + private ModelTabulky data = new ModelTabulky(); + + /** Creates new form PanelPrijemcu */ + public PanelPrijemcu() { + initComponents(); + tabulka.setModel(data); + tabulka.setSelectionMode(DefaultListSelectionModel.SINGLE_SELECTION); + } + + public ArrayList getAdresy() { + /** TODO: vracet kopii? */ + return data.data; + } + + /** + * @param prijemci pokud je null, nastaví prázdná kolekce. + */ + public void setAdresy(Collection adresy) { + data.data = new ArrayList(); + pridejAdresu(adresy); + } + + public void pridejAdresu(Collection adresy) { + if (adresy == null) { + log.log(Level.FINER, "Prázdná množina adres - nic nepřidáme"); + } else { + data.data.addAll(adresy); + data.upozorniPosluchace(); + } + } + + /** + * Pokud je needitovatelný, nelze měnit data v tabuce + * a z tlačítek je povoleno pouze tlačítko pro uložení do souboru. + */ + public void setEditovatelny(boolean editovatelny) { + otevrit.setEnabled(editovatelny); + pridat.setEnabled(editovatelny); + odebrat.setEnabled(editovatelny); + tabulka.setEnabled(editovatelny); + } + + /** This method is called from within the constructor to + * initialize the form. + * WARNING: Do NOT modify this code. The content of this method is + * always regenerated by the Form Editor. + */ + // //GEN-BEGIN:initComponents + private void initComponents() { + + jScrollPane1 = new javax.swing.JScrollPane(); + tabulka = new cz.frantovo.gui.tabulky.JTable(); + pridat = new javax.swing.JButton(); + odebrat = new javax.swing.JButton(); + ulozit = new javax.swing.JButton(); + otevrit = new javax.swing.JButton(); + + tabulka.setModel(new javax.swing.table.DefaultTableModel( + new Object [][] { + {null, null, null, null}, + {null, null, null, null}, + {null, null, null, null}, + {null, null, null, null} + }, + new String [] { + "Title 1", "Title 2", "Title 3", "Title 4" + } + )); + jScrollPane1.setViewportView(tabulka); + + pridat.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/frantovo/superPostak/obrazky/vlozit.png"))); // NOI18N + pridat.setMnemonic('i'); + pridat.setText("Přidat"); + pridat.setToolTipText("\nPřidá prázdný řádek pro vložení nového příjemce
\nAby se napsaná změna projevila, je potřeba kliknout jinam do tabulky
\n(tzn. ukončit režim editace buňky)
\n"); + pridat.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + pridatActionPerformed(evt); + } + }); + + odebrat.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/frantovo/superPostak/obrazky/editdelete.png"))); // NOI18N + odebrat.setMnemonic('r'); + odebrat.setText("Odebrat"); + odebrat.setToolTipText("Odebere vybraného příjemce"); + odebrat.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + odebratActionPerformed(evt); + } + }); + + ulozit.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/frantovo/superPostak/obrazky/ulozit.png"))); // NOI18N + ulozit.setToolTipText("Uložit seznam příjemců do souboru."); + ulozit.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + ulozitActionPerformed(evt); + } + }); + + otevrit.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/frantovo/superPostak/obrazky/otevrit.png"))); // NOI18N + otevrit.setToolTipText("Přidat příjemce ze souboru.
Na každém řádku se očekává jedna adresa."); + otevrit.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + otevritActionPerformed(evt); + } + }); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); + this.setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addContainerGap(97, Short.MAX_VALUE) + .addComponent(otevrit) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(ulozit) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(odebrat) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(pridat) + .addContainerGap()) + .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 410, Short.MAX_VALUE) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 253, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(pridat) + .addComponent(odebrat) + .addComponent(ulozit) + .addComponent(otevrit)) + .addContainerGap()) + ); + }//
//GEN-END:initComponents + private void pridatActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_pridatActionPerformed + data.pridejRadek(); + }//GEN-LAST:event_pridatActionPerformed + + private void odebratActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_odebratActionPerformed + int radkaV = tabulka.getSelectedRow(); + int radka = ((TableSorterModel) tabulka.getModel()).modelIndex(radkaV); + if (radka > -1 && radka < data.getRowCount()) { + data.odeberRadek(radka); + } + }//GEN-LAST:event_odebratActionPerformed + + private void ulozitActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ulozitActionPerformed + JFileChooser dialog = new JFileChooser(); + dialog.setMultiSelectionEnabled(false); + dialog.setDialogTitle("Uložit seznam do souboru"); + int vysledek = dialog.showSaveDialog(this); + if (vysledek == JFileChooser.APPROVE_OPTION) { + File soubor = dialog.getSelectedFile(); + try { + setCursor(new Cursor(Cursor.WAIT_CURSOR)); + OutputStreamWriter zapisovac = new FileWriter(soubor); + int pocetDobrych = 0; + int pocetPreskocenych = 0; + + for (InternetAddressKomu adresa : data.data) { + /** TODO: různé formátování, případně jména */ + if (Postak.zkontrolujAdresu(adresa.getAddress())) { + zapisovac.write(adresa.getAddress() + "\n"); + pocetDobrych++; + } else { + pocetPreskocenych++; + } + } + + zapisovac.close(); + String preskocene = ""; + if (pocetPreskocenych > 0) { + preskocene = "\nPočet přeskočených: " + pocetPreskocenych + "\n(Přeskočené neodpovídaly regulárnímu výrazu.)"; + + } + SuperPostak.zobrazInformacniDialog(this, "Uložení seznamu", "Adresy příjemců byly úspěšně uloženy do souboru:\n" + soubor.getAbsolutePath() + "\nPočet uložených adres: " + pocetDobrych + preskocene, true); + } catch (Exception e) { + SuperPostak.zobrazChybovyDialog(this, "Uložení seznamu selhalo", "Adresy se nepodařilo uložit do souboru.", null, e, Level.WARNING, false); + } finally { + setCursor(Cursor.getDefaultCursor()); + } + } + }//GEN-LAST:event_ulozitActionPerformed + + private void otevritActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_otevritActionPerformed + JFileChooser dialog = new JFileChooser(); + dialog.setMultiSelectionEnabled(false); + dialog.setDialogTitle("Načíst adresy ze souboru"); + int vysledek = dialog.showOpenDialog(this); + if (vysledek == JFileChooser.APPROVE_OPTION) { + File soubor = dialog.getSelectedFile(); + try { + setCursor(new Cursor(Cursor.WAIT_CURSOR)); + BufferedReader ctenar = new BufferedReader(new FileReader(soubor)); + int pocetDobrych = 0; + int pocetPreskocenych = 0; + String radka = ctenar.readLine(); + ArrayList adresy = new ArrayList(); + + while (radka != null) { + if (Postak.zkontrolujAdresu(radka)) { + adresy.add(new InternetAddressKomu(radka, null)); + pocetDobrych++; + + } else { + pocetPreskocenych++; + } + + radka = ctenar.readLine(); + } + + setAdresy(adresy); + ctenar.close(); + String preskocene = ""; + if (pocetPreskocenych > 0) { + preskocene = "\nPočet přeskočených: " + pocetPreskocenych + "\n(Přeskočené neodpovídaly regulárnímu výrazu.)"; + + } + + SuperPostak.zobrazInformacniDialog(this, "Načtení adres", "Byl načten seznam adres ze souboru:\n" + soubor.getAbsolutePath() + "\nPočet načtených adres: " + pocetDobrych + preskocene, true); + } catch (Exception e) { + SuperPostak.zobrazChybovyDialog(this, "Načtení souboru selhalo", "Nepodařilo se načíst soubor s adresami.", null, e, Level.WARNING, false); + } finally { + setCursor(Cursor.getDefaultCursor()); + } + + } + }//GEN-LAST:event_otevritActionPerformed + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JScrollPane jScrollPane1; + private javax.swing.JButton odebrat; + private javax.swing.JButton otevrit; + private javax.swing.JButton pridat; + private cz.frantovo.gui.tabulky.JTable tabulka; + private javax.swing.JButton ulozit; + // End of variables declaration//GEN-END:variables + private class ModelTabulky implements TableModel { + + private String[] sloupecky = {"Jméno", "e-mail"}; + private ArrayList data = new ArrayList(); + private HashSet posluchace = new HashSet(); + + public int getRowCount() { + return data.size(); + } + + public int getColumnCount() { + return sloupecky.length; + } + + public String getColumnName(int n) { + return sloupecky[n]; + } + + public Class getColumnClass(int n) { + return String.class; + } + + public boolean isCellEditable(int m, int n) { + return true; + } + + public Object getValueAt(int m, int n) { + if (n == 0) { + return data.get(m).getPersonal(); + } else if (n == 1) { + return data.get(m).getAddress(); + } else { + return null; + } + } + + public void setValueAt(Object value, int m, int n) { + if (n == 0) { + try { + data.get(m).setPersonal(String.valueOf(value.toString())); + } catch (Exception ex) { + log.log(Level.SEVERE, "ModelTabulky.setValueAt(" + m + ", " + n + ")", ex); + } + } else if (n == 1) { + data.get(m).setAddress(String.valueOf(value.toString())); + } + } + + public void addTableModelListener(TableModelListener l) { + posluchace.add(l); + } + + public void removeTableModelListener(TableModelListener l) { + posluchace.remove(l); + } + + public void pridejRadek() { + data.add(new InternetAddressKomu()); + + upozorniPosluchace(); + } + + public void odeberRadek(int m) { + data.remove(m); + upozorniPosluchace(); + } + + private void upozorniPosluchace() { + for (TableModelListener p : posluchace) { + p.tableChanged(new TableModelEvent(this)); + } + } + } +} diff -r 000000000000 -r e76872ad5226 java/SuperPostak/src/cz/frantovo/superPostak/Pokus.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/java/SuperPostak/src/cz/frantovo/superPostak/Pokus.java Sun Nov 23 22:19:20 2008 +0100 @@ -0,0 +1,43 @@ +package cz.frantovo.superPostak; + +import java.util.Properties; +import javax.mail.Message; +import javax.mail.Session; +import javax.mail.Transport; +import javax.mail.internet.InternetAddress; +import javax.mail.internet.MimeMessage; + +/** + * + * @author fiki + */ +public class Pokus { + + private static Session smtpSession; + + public static void main (String[] args) { + Properties props = System.getProperties(); + props.put("mail.smtp.host", "frantovo.cz"); + //PopUpAuthenticator auth = new PopUpAuthenticator(); + smtpSession = Session.getInstance(props, null); + + try { + MimeMessage message = new MimeMessage(smtpSession); + message.setFrom(new InternetAddress("java@frantovo.cz", "SuperPošťák")); + message.addRecipient(Message.RecipientType.TO, + new InternetAddress("informace@frantovo.cz", "František Kučera")); + message.setSubject("Předmět zprávy"); + message.setText("Ahoj, jak se máš? šřtžěýžééšž Java WebStart"); + + + Transport.send(message); + + } catch (Exception e) { + + e.printStackTrace(); + } + + + } + +} diff -r 000000000000 -r e76872ad5226 java/SuperPostak/src/cz/frantovo/superPostak/SuperPostak.form --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/java/SuperPostak/src/cz/frantovo/superPostak/SuperPostak.form Sun Nov 23 22:19:20 2008 +0100 @@ -0,0 +1,873 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff -r 000000000000 -r e76872ad5226 java/SuperPostak/src/cz/frantovo/superPostak/SuperPostak.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/java/SuperPostak/src/cz/frantovo/superPostak/SuperPostak.java Sun Nov 23 22:19:20 2008 +0100 @@ -0,0 +1,1241 @@ +package cz.frantovo.superPostak; + +import cz.frantovo.postak.HromadnaZprava; +import cz.frantovo.postak.InternetAddressKomu; +import cz.frantovo.postak.Nastaveni; +import cz.frantovo.postak.Postak; +import java.awt.CardLayout; +import java.awt.Component; +import java.awt.Cursor; +import java.awt.Dialog.ModalityType; +import java.awt.KeyboardFocusManager; +import java.beans.XMLDecoder; +import java.beans.XMLEncoder; +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.logging.Level; +import java.util.logging.Logger; +import java.util.zip.GZIPInputStream; +import java.util.zip.GZIPOutputStream; +import javax.mail.MessagingException; +import javax.mail.internet.InternetAddress; +import javax.swing.JComponent; +import javax.swing.JDialog; +import javax.swing.JOptionPane; +import javax.swing.JTextArea; +import javax.swing.LookAndFeel; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; +import org.jdesktop.swingx.JXErrorPane; +import org.jdesktop.swingx.JXTaskPaneContainer; +import org.jdesktop.swingx.error.ErrorInfo; +import org.jvnet.substance.skin.SubstanceBusinessBlueSteelLookAndFeel; + +/** + * + * @author fiki + */ +public class SuperPostak extends javax.swing.JFrame { + + /** Soubor, kde je uložené nastavení */ + private static final String NASTAVENI_SOUBOR = "Nastaveni.xml.gz"; + private static final String CERTIFIKATY_SOUBOR = "DuveryhodneCertifikaty.keystore"; + private static final String NASTAVENI_SLOZKA = ".SuperPostak"; + private static final String DOMACI_ADRESAR = System.getProperty("user.home"); + private static Logger log = Logger.getLogger(SuperPostak.class.getName()); + private Nastaveni nastaveni = new Nastaveni(); + private Postak postak = new Postak(nastaveni); + + /** + * Creates new form SuperPostak + * @param ladit předvyplní testovací hodnoty - zprávu + * @param exit při zavření okna ukončí program + */ + public SuperPostak(boolean ladit, boolean exit) { + log.log(Level.WARNING, "Program byl spuštěn."); + nactiOvladaceJDBC(); + vytvorSlozkuProgramu(); + initComponents(); + + nactiNastaveni(); + ulozNastaveni(); + nastaveni.setCestaKCertifikatum(getCestaKCertifikatum()); + + inicializujCardLayout(); + setLocationRelativeTo(null); + + /** Vyřešíme problém TAB vs. Focus */ + vyresitTabFocusProblem(vstupSQL); + vyresitTabFocusProblem(vstupZprava); + + /** Ladicí hodnoty */ + if (ladit) { + nastavLadiciHodnoty(); + } + + if (exit) { + setDefaultCloseOperation(EXIT_ON_CLOSE); + } + + + } + + private void inicializujCardLayout() { + panelDatabaze.setName("panelDatabaze"); + panelOdeslat.setName("panelOdeslat"); + panelPrijemci.setName("panelPrijemci"); + panelServer.setName("panelServer"); + panelVychoziPrijemci.setName("panelVychoziPrijemci"); + panelZprava.setName("panelZprava"); + + panel.add(panelDatabaze, panelDatabaze.getName()); + panel.add(panelOdeslat, panelOdeslat.getName()); + panel.add(panelPrijemci, panelPrijemci.getName()); + panel.add(panelServer, panelServer.getName()); + panel.add(panelVychoziPrijemci, panelVychoziPrijemci.getName()); + panel.add(panelZprava, panelZprava.getName()); + + setPanel(panelZprava); + pack(); + } + + /** + * Vyplní formuláře (odesílatel, předmět, zpráva, příjemci...) výchozími hodnotami, + * aby se dal program testovat jedním kliknutím. + */ + private void nastavLadiciHodnoty() { + try { + vstupAdresaOdesilatele.setText("SuperPostak@frantovo.cz"); + vstupJmenoOdesilatele.setText("SuperPošťák"); + vstupPredmet.setText("Zkušební zpráva od SuperPošťáka"); + vstupZprava.setText("Toto je obyčejná zkušební zpráva v češtině :-)"); + ArrayList adresy = new ArrayList(); + adresy.add(new InternetAddressKomu("SuperPostak@frantovo.cz", "SuperPošťák")); + prijemciZkusebni.setAdresy(adresy); + } catch (UnsupportedEncodingException e) { + log.log(Level.SEVERE, null, e); + } + } + + /** + * Pokusíme se načíst ovladače pro různé DB a výsledek zapíšeme do logu. + * Další ovladače je možné přidat pomocí manifestu v příslušných knihovnách. + * viz http://www.sweb.cz/pichlik/archive/2006_08_06_archive.html#115502885631518161 + */ + private void nactiOvladaceJDBC() { + nactiOvladacJDBC("org.postgresql.Driver", "PostgreSQL"); + nactiOvladacJDBC("com.mysql.jdbc.Driver", "MySQL"); + nactiOvladacJDBC("net.sourceforge.jtds.jdbc.Driver", "jTDS Sybase a MS SQL"); + nactiOvladacJDBC("com.sybase.jdbc2.jdbc.SybDriver", "Sybase.com"); + } + + /** + * @param trida ovladač databáze, který se má načíst + * @param jmeno název databáze + */ + private void nactiOvladacJDBC(String trida, String jmeno) { + try { + Class.forName(trida); + log.log(Level.INFO, "JDBC ovladač pro " + jmeno + " byl úspěšně načten."); + } catch (ClassNotFoundException e) { + log.log(Level.INFO, "JDBC ovladač pro " + jmeno + " se nepodařilo načíst."); + } + } + + /** Vrací plnou cestu k souboru s nastavením */ + protected static String getCestaKCertifikatum() { + return getCestaKeSlozceProgramu() + CERTIFIKATY_SOUBOR; + } + + /** Vrací plnou cestu k souboru s nastavením */ + protected static String getCestaKNastaveni() { + return getCestaKeSlozceProgramu() + NASTAVENI_SOUBOR; + } + + /** Vrací plnou cestu ke složce programu (nastavení, certifikáty a logy) */ + protected static String getCestaKeSlozceProgramu() { + return DOMACI_ADRESAR + File.separator + NASTAVENI_SLOZKA + File.separator; + } + + /** Načte nastavení ze souboru */ + private void nactiNastaveni() { + try { + XMLDecoder d = new XMLDecoder(new BufferedInputStream(new GZIPInputStream(new FileInputStream(getCestaKNastaveni())))); + Object xmlObjekt = d.readObject(); + d.close(); + + if (xmlObjekt instanceof Nastaveni) { + nastaveni = (Nastaveni) xmlObjekt; + } else { + nastaveni = new Nastaveni(); + log.log(Level.SEVERE, "Nepodařilo se načíst nastavení: není instancí"); + } + + nactiNastaveniGUI(); + + log.log(Level.INFO, "Nastavení bylo načteno."); + } catch (FileNotFoundException ex) { + log.log(Level.SEVERE, "Nepodařilo se načíst nastavení: soubor nenalezen", ex); + } catch (IOException ex) { + log.log(Level.SEVERE, "Nastavení se nepodařilo načíst: I/O.", ex); + } + } + + /** Vytvoří (pokud neexistuje) v domovském adresáři složku, kam se ukládá nastavení a případně logy */ + private static boolean vytvorSlozkuProgramu() { + if (new File(getCestaKeSlozceProgramu()).mkdirs()) { + log.log(Level.INFO, "Složka pro nastavení programu byla vytvořena: " + getCestaKeSlozceProgramu()); + return true; + } else { + return false; + } + } + + /** Uloží nastavení do souboru */ + private void ulozNastaveni() { + try { + ulozNastaveniGUI(); + + vytvorSlozkuProgramu(); + + XMLEncoder e = new XMLEncoder(new BufferedOutputStream(new GZIPOutputStream(new FileOutputStream(getCestaKNastaveni())))); + e.writeObject(nastaveni); + e.close(); + log.log(Level.INFO, "Nastavení bylo uloženo."); + } catch (FileNotFoundException ex) { + log.log(Level.SEVERE, "Nastavení se nepodařilo uložit: soubor nenalezen.", ex); + } catch (IOException ex) { + log.log(Level.SEVERE, "Nastavení se nepodařilo uložit: I/O.", ex); + } + } + + /** Posbírá zadané hodnoty z GUI a uloží je do objektu nastaveni */ + private void ulozNastaveniGUI() { + nastaveni.setDatabaze(vstupDatabaze.getText()); + nastaveni.setDbHeslo(vstupDBheslo.getPassword()); + nastaveni.setDbJmeno(vstupDBjmeno.getText()); + nastaveni.setLimitZprav((Integer) vstupSMTPlimitPrijemcu.getValue()); + nastaveni.setPostovniHeslo(vstupSMTPheslo.getPassword()); + nastaveni.setPostovniJmeno(vstupSMTPjmeno.getText()); + nastaveni.setPostovniPort((Integer) vstupSMTPport.getValue()); + nastaveni.setPostovniServer(vstupSMTPserver.getText()); + nastaveni.setVychoziPrijemci(prijemciVychozi.getAdresy()); + } + + /** Aktualizuje GUI formuláře hodnotami z objektu nastaveni */ + private void nactiNastaveniGUI() { + vstupDatabaze.setText(nastaveni.getDatabaze()); + if (nastaveni.getDbHeslo() != null) { + vstupDBheslo.setText(String.valueOf(nastaveni.getDbHeslo())); + } + vstupDBjmeno.setText(nastaveni.getDbJmeno()); + vstupSMTPlimitPrijemcu.setValue(nastaveni.getLimitZprav()); + if (nastaveni.getPostovniHeslo() != null) { + vstupSMTPheslo.setText(String.valueOf(nastaveni.getPostovniHeslo())); + } + vstupSMTPjmeno.setText(nastaveni.getPostovniJmeno()); + vstupSMTPport.setValue(nastaveni.getPostovniPort()); + vstupSMTPserver.setText(nastaveni.getPostovniServer()); + prijemciVychozi.setAdresy(nastaveni.getVychoziPrijemci()); + } + + protected static void zobrazChybovyDialog(Component vlastnik, String strucnaZprava, Throwable vyjimka, Level zavaznost, boolean logovat) { + zobrazChybovyDialog(vlastnik, "Chyba", strucnaZprava, null, vyjimka, zavaznost, logovat); + } + + protected static void zobrazInformacniDialog(Component vlastnik, String nadpis, String text, boolean loguj) { + JOptionPane.showMessageDialog(vlastnik, text, nadpis, JOptionPane.INFORMATION_MESSAGE); + if (loguj) { + log.log(Level.INFO, nadpis + ": " + text); + } + } + + protected static void zobrazChybovyDialog(Component vlastnik, String nadpis, String strucnaZprava, String podrobnaZprava, Throwable vyjimka, Level zavaznost, boolean logovat) { + if (logovat) { + log.log(zavaznost, strucnaZprava, vyjimka); + } + + JXErrorPane chybovyPanel = new JXErrorPane(); + ErrorInfo chybovaInformace = new ErrorInfo(nadpis, strucnaZprava, podrobnaZprava, null, vyjimka, zavaznost, null); + chybovyPanel.setErrorInfo(chybovaInformace); + JDialog dialog = JXErrorPane.createDialog(vlastnik, chybovyPanel); + dialog.setVisible(true); + } + + private void zobrazChybovyDialog(String strucnaZprava, Throwable vyjimka, Level zavaznost, boolean logovat) { + zobrazChybovyDialog(this, strucnaZprava, vyjimka, zavaznost, logovat); + } + + private void zobrazInformacniDialog(String nadpis, String text, boolean loguj) { + zobrazInformacniDialog(this, nadpis, text, loguj); + } + + private void zobrazChybovyDialog(String nadpis, String strucnaZprava, String podrobnaZprava, Throwable vyjimka, Level zavaznost, boolean logovat) { + zobrazChybovyDialog(this, nadpis, strucnaZprava, podrobnaZprava, vyjimka, zavaznost, logovat); + } + + /** This method is called from within the constructor to + * initialize the form. + * WARNING: Do NOT modify this code. The content of this method is + * always regenerated by the Form Editor. + */ + // //GEN-BEGIN:initComponents + private void initComponents() { + + panelDatabaze = new org.jdesktop.swingx.JXPanel(); + jLabel9 = new javax.swing.JLabel(); + vstupDatabaze = new javax.swing.JTextField(); + jLabel10 = new javax.swing.JLabel(); + vstupDBjmeno = new javax.swing.JTextField(); + vstupDBheslo = new javax.swing.JPasswordField(); + jLabel11 = new javax.swing.JLabel(); + vyzkousetPripojeniTlacitko = new javax.swing.JButton(); + vystupDBzprava = new javax.swing.JLabel(); + panelOdeslat = new org.jdesktop.swingx.JXPanel(); + jPanel1 = new javax.swing.JPanel(); + rozeslatZkusebniTlacitko = new javax.swing.JButton(); + rozeslatHromadnouZpravuTlacitko = new javax.swing.JButton(); + zobrazitVsechnyPrijemceTlacitko = new javax.swing.JButton(); + prijemciZkusebni = new cz.frantovo.superPostak.PanelPrijemcu(); + jSeparator2 = new javax.swing.JSeparator(); + jLabel14 = new javax.swing.JLabel(); + panelPrijemci = new org.jdesktop.swingx.JXPanel(); + jLabel13 = new javax.swing.JLabel(); + jScrollPane3 = new javax.swing.JScrollPane(); + vstupSQL = new javax.swing.JTextArea(); + vyzkousetSQLTlacitko = new javax.swing.JButton(); + vystupSQLZprava = new javax.swing.JLabel(); + prijemciDodatecni = new cz.frantovo.superPostak.PanelPrijemcu(); + jSeparator1 = new javax.swing.JSeparator(); + jLabel16 = new javax.swing.JLabel(); + zobrazitSQLPrijemceTlacitko = new javax.swing.JButton(); + panelServer = new org.jdesktop.swingx.JXPanel(); + jLabel4 = new javax.swing.JLabel(); + jLabel5 = new javax.swing.JLabel(); + vstupSMTPserver = new javax.swing.JTextField(); + vstupSMTPport = new javax.swing.JSpinner(); + napovedaSMTPscroll = new javax.swing.JScrollPane(); + napovedaSMTP = new javax.swing.JTextArea(); + jLabel6 = new javax.swing.JLabel(); + vstupSMTPjmeno = new javax.swing.JTextField(); + vstupSMTPheslo = new javax.swing.JPasswordField(); + jLabel7 = new javax.swing.JLabel(); + vstupSMTPlimitPrijemcu = new javax.swing.JSpinner(); + jLabel8 = new javax.swing.JLabel(); + panelVychoziPrijemci = new org.jdesktop.swingx.JXPanel(); + prijemciVychozi = new cz.frantovo.superPostak.PanelPrijemcu(); + jLabel12 = new javax.swing.JLabel(); + panelZprava = new org.jdesktop.swingx.JXPanel(); + jLabel1 = new javax.swing.JLabel(); + vstupPredmet = new javax.swing.JTextField(); + jLabel2 = new javax.swing.JLabel(); + vstupJmenoOdesilatele = new javax.swing.JTextField(); + vstupAdresaOdesilatele = new javax.swing.JTextField(); + jScrollPane1 = new javax.swing.JScrollPane(); + vstupZprava = new javax.swing.JTextArea(); + jLabel15 = new javax.swing.JLabel(); + vstupFormatHTML = new javax.swing.JCheckBox(); + odpovedetKomuOdkaz = new org.jdesktop.swingx.JXHyperlink(); + odpovedetKomuDialog = new javax.swing.JDialog(); + jLabel18 = new javax.swing.JLabel(); + jLabel19 = new javax.swing.JLabel(); + jLabel17 = new javax.swing.JLabel(); + odpovedetKomuJmeno = new javax.swing.JTextField(); + odpovedetKomuAdresa = new javax.swing.JTextField(); + odpovedetKomuHotovo = new javax.swing.JButton(); + jXHeader1 = new org.jdesktop.swingx.JXHeader(); + taskPanel = new org.jdesktop.swingx.JXTaskPaneContainer(); + jXTaskPane1 = new org.jdesktop.swingx.JXTaskPane(); + lnText = new org.jdesktop.swingx.JXHyperlink(); + lnPrijemci = new org.jdesktop.swingx.JXHyperlink(); + lnOdeslat = new org.jdesktop.swingx.JXHyperlink(); + jXTaskPane2 = new org.jdesktop.swingx.JXTaskPane(); + lnServer = new org.jdesktop.swingx.JXHyperlink(); + lnDatabaze = new org.jdesktop.swingx.JXHyperlink(); + lnVychoziPrijemci = new org.jdesktop.swingx.JXHyperlink(); + panel = new org.jdesktop.swingx.JXPanel(); + + jLabel9.setText("Databáze"); + + jLabel10.setText("Jméno"); + + jLabel11.setText("Heslo"); + + vyzkousetPripojeniTlacitko.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/frantovo/superPostak/obrazky/fork.png"))); // NOI18N + vyzkousetPripojeniTlacitko.setMnemonic('y'); + vyzkousetPripojeniTlacitko.setText("Vyzkoušet spojení"); + vyzkousetPripojeniTlacitko.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + vyzkousetPripojeniTlacitkoActionPerformed(evt); + } + }); + + vystupDBzprava.setText(" "); + + javax.swing.GroupLayout panelDatabazeLayout = new javax.swing.GroupLayout(panelDatabaze); + panelDatabaze.setLayout(panelDatabazeLayout); + panelDatabazeLayout.setHorizontalGroup( + panelDatabazeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(panelDatabazeLayout.createSequentialGroup() + .addContainerGap() + .addGroup(panelDatabazeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(panelDatabazeLayout.createSequentialGroup() + .addGroup(panelDatabazeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jLabel9) + .addComponent(jLabel10) + .addComponent(jLabel11)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(panelDatabazeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(vstupDatabaze, javax.swing.GroupLayout.DEFAULT_SIZE, 257, Short.MAX_VALUE) + .addComponent(vstupDBjmeno, javax.swing.GroupLayout.DEFAULT_SIZE, 257, Short.MAX_VALUE) + .addGroup(panelDatabazeLayout.createSequentialGroup() + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(vstupDBheslo, javax.swing.GroupLayout.DEFAULT_SIZE, 257, Short.MAX_VALUE)))) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelDatabazeLayout.createSequentialGroup() + .addComponent(vystupDBzprava, javax.swing.GroupLayout.DEFAULT_SIZE, 155, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(vyzkousetPripojeniTlacitko))) + .addContainerGap()) + ); + panelDatabazeLayout.setVerticalGroup( + panelDatabazeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(panelDatabazeLayout.createSequentialGroup() + .addContainerGap() + .addGroup(panelDatabazeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jLabel9) + .addComponent(vstupDatabaze, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(panelDatabazeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jLabel10) + .addComponent(vstupDBjmeno, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(panelDatabazeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jLabel11) + .addComponent(vstupDBheslo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addGroup(panelDatabazeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(vyzkousetPripojeniTlacitko) + .addComponent(vystupDBzprava)) + .addContainerGap(183, Short.MAX_VALUE)) + ); + + rozeslatZkusebniTlacitko.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/frantovo/superPostak/obrazky/apply.png"))); // NOI18N + rozeslatZkusebniTlacitko.setMnemonic('u'); + rozeslatZkusebniTlacitko.setText("Rozeslat zkušební"); + rozeslatZkusebniTlacitko.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + rozeslatZkusebniTlacitkoActionPerformed(evt); + } + }); + + rozeslatHromadnouZpravuTlacitko.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/frantovo/superPostak/obrazky/adept_commit.png"))); // NOI18N + rozeslatHromadnouZpravuTlacitko.setMnemonic('h'); + rozeslatHromadnouZpravuTlacitko.setText("Rozeslat hromadnou zprávu"); + rozeslatHromadnouZpravuTlacitko.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + rozeslatHromadnouZpravuTlacitkoActionPerformed(evt); + } + }); + + zobrazitVsechnyPrijemceTlacitko.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/frantovo/superPostak/obrazky/zobrazit_adresy.png"))); // NOI18N + zobrazitVsechnyPrijemceTlacitko.setToolTipText("\nZobrazí seznam všech příjemcům, kterým bude odeslána zpráva.
\n(Při velkých počtech záznamů může být tato operace náročná.)\n"); + zobrazitVsechnyPrijemceTlacitko.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + zobrazitVsechnyPrijemceTlacitkoActionPerformed(evt); + } + }); + + javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); + jPanel1.setLayout(jPanel1Layout); + jPanel1Layout.setHorizontalGroup( + jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup() + .addContainerGap(106, Short.MAX_VALUE) + .addComponent(rozeslatZkusebniTlacitko) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(rozeslatHromadnouZpravuTlacitko) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(zobrazitVsechnyPrijemceTlacitko) + .addContainerGap()) + ); + jPanel1Layout.setVerticalGroup( + jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel1Layout.createSequentialGroup() + .addContainerGap() + .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(rozeslatHromadnouZpravuTlacitko) + .addComponent(zobrazitVsechnyPrijemceTlacitko) + .addComponent(rozeslatZkusebniTlacitko)) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + + jLabel14.setText("Zkušební příjemci"); + + javax.swing.GroupLayout panelOdeslatLayout = new javax.swing.GroupLayout(panelOdeslat); + panelOdeslat.setLayout(panelOdeslatLayout); + panelOdeslatLayout.setHorizontalGroup( + panelOdeslatLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(panelOdeslatLayout.createSequentialGroup() + .addContainerGap() + .addGroup(panelOdeslatLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(prijemciZkusebni, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 535, Short.MAX_VALUE) + .addComponent(jSeparator2, javax.swing.GroupLayout.DEFAULT_SIZE, 535, Short.MAX_VALUE) + .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(jLabel14)) + .addContainerGap()) + ); + panelOdeslatLayout.setVerticalGroup( + panelOdeslatLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelOdeslatLayout.createSequentialGroup() + .addContainerGap() + .addComponent(jLabel14) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(prijemciZkusebni, javax.swing.GroupLayout.DEFAULT_SIZE, 153, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(jSeparator2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addContainerGap()) + ); + + jLabel13.setText("SQL dotaz"); + + vstupSQL.setColumns(20); + vstupSQL.setRows(5); + jScrollPane3.setViewportView(vstupSQL); + + vyzkousetSQLTlacitko.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/frantovo/superPostak/obrazky/fork.png"))); // NOI18N + vyzkousetSQLTlacitko.setMnemonic('y'); + vyzkousetSQLTlacitko.setText("Vyzkoušet"); + vyzkousetSQLTlacitko.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + vyzkousetSQLTlacitkoActionPerformed(evt); + } + }); + + vystupSQLZprava.setText(" "); + + prijemciDodatecni.setToolTipText("Zde můžete dopnit další přijemce."); + + jLabel16.setText("Dodateční příjemci:"); + + zobrazitSQLPrijemceTlacitko.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/frantovo/superPostak/obrazky/zobrazit_adresy.png"))); // NOI18N + zobrazitSQLPrijemceTlacitko.setToolTipText("\nZobrazí seznam adres načtených z databáze.
\n(Při velkých počtech záznamů může být tato operace náročná.)\n"); + zobrazitSQLPrijemceTlacitko.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + zobrazitSQLPrijemceTlacitkoActionPerformed(evt); + } + }); + + javax.swing.GroupLayout panelPrijemciLayout = new javax.swing.GroupLayout(panelPrijemci); + panelPrijemci.setLayout(panelPrijemciLayout); + panelPrijemciLayout.setHorizontalGroup( + panelPrijemciLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelPrijemciLayout.createSequentialGroup() + .addContainerGap() + .addGroup(panelPrijemciLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(prijemciDodatecni, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 344, Short.MAX_VALUE) + .addComponent(jSeparator1, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 344, Short.MAX_VALUE) + .addComponent(jScrollPane3, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 344, Short.MAX_VALUE) + .addComponent(jLabel13, javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(panelPrijemciLayout.createSequentialGroup() + .addComponent(vystupSQLZprava, javax.swing.GroupLayout.DEFAULT_SIZE, 52, Short.MAX_VALUE) + .addGap(127, 127, 127) + .addComponent(vyzkousetSQLTlacitko) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(zobrazitSQLPrijemceTlacitko)) + .addComponent(jLabel16, javax.swing.GroupLayout.Alignment.LEADING)) + .addContainerGap()) + ); + panelPrijemciLayout.setVerticalGroup( + panelPrijemciLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(panelPrijemciLayout.createSequentialGroup() + .addContainerGap() + .addComponent(jLabel13) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jScrollPane3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(panelPrijemciLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(vystupSQLZprava, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(zobrazitSQLPrijemceTlacitko) + .addComponent(vyzkousetSQLTlacitko)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, 10, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jLabel16) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(prijemciDodatecni, javax.swing.GroupLayout.DEFAULT_SIZE, 200, Short.MAX_VALUE) + .addContainerGap()) + ); + + jLabel4.setText("SMTP server"); + + jLabel5.setText("Port"); + + vstupSMTPserver.setText("localhost"); + + vstupSMTPport.setValue(25); + + napovedaSMTP.setColumns(20); + napovedaSMTP.setEditable(false); + napovedaSMTP.setLineWrap(true); + napovedaSMTP.setRows(5); + napovedaSMTP.setText("Tip: některé SMTP servery mají omezený seznam počítačů, ze kterých přijímají poštu"); + napovedaSMTP.setWrapStyleWord(true); + napovedaSMTPscroll.setViewportView(napovedaSMTP); + + jLabel6.setText("Jméno"); + + jLabel7.setText("Heslo"); + + vstupSMTPlimitPrijemcu.setValue(1000); + + jLabel8.setText("Limit příjemců"); + + javax.swing.GroupLayout panelServerLayout = new javax.swing.GroupLayout(panelServer); + panelServer.setLayout(panelServerLayout); + panelServerLayout.setHorizontalGroup( + panelServerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelServerLayout.createSequentialGroup() + .addContainerGap() + .addGroup(panelServerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(napovedaSMTPscroll, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 318, Short.MAX_VALUE) + .addGroup(panelServerLayout.createSequentialGroup() + .addGroup(panelServerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jLabel4) + .addComponent(jLabel6) + .addComponent(jLabel5) + .addComponent(jLabel7) + .addComponent(jLabel8)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(panelServerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(vstupSMTPserver, javax.swing.GroupLayout.DEFAULT_SIZE, 230, Short.MAX_VALUE) + .addComponent(vstupSMTPport, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 230, Short.MAX_VALUE) + .addComponent(vstupSMTPjmeno, javax.swing.GroupLayout.DEFAULT_SIZE, 230, Short.MAX_VALUE) + .addComponent(vstupSMTPheslo, javax.swing.GroupLayout.DEFAULT_SIZE, 230, Short.MAX_VALUE) + .addComponent(vstupSMTPlimitPrijemcu, javax.swing.GroupLayout.DEFAULT_SIZE, 230, Short.MAX_VALUE)))) + .addContainerGap()) + ); + panelServerLayout.setVerticalGroup( + panelServerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(panelServerLayout.createSequentialGroup() + .addContainerGap() + .addGroup(panelServerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jLabel4) + .addComponent(vstupSMTPserver, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(panelServerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(vstupSMTPport, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(jLabel5)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(panelServerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jLabel6) + .addComponent(vstupSMTPjmeno, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(panelServerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(vstupSMTPheslo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(jLabel7)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(panelServerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(vstupSMTPlimitPrijemcu, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(jLabel8)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(napovedaSMTPscroll, javax.swing.GroupLayout.DEFAULT_SIZE, 145, Short.MAX_VALUE) + .addContainerGap()) + ); + + jLabel12.setText("Těmto lidem přijde hromadný e-mail vždy (netýká se zkušebního rozeslání zprávy)."); + + javax.swing.GroupLayout panelVychoziPrijemciLayout = new javax.swing.GroupLayout(panelVychoziPrijemci); + panelVychoziPrijemci.setLayout(panelVychoziPrijemciLayout); + panelVychoziPrijemciLayout.setHorizontalGroup( + panelVychoziPrijemciLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelVychoziPrijemciLayout.createSequentialGroup() + .addContainerGap() + .addGroup(panelVychoziPrijemciLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(prijemciVychozi, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 514, Short.MAX_VALUE) + .addComponent(jLabel12, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 514, Short.MAX_VALUE)) + .addContainerGap()) + ); + panelVychoziPrijemciLayout.setVerticalGroup( + panelVychoziPrijemciLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(panelVychoziPrijemciLayout.createSequentialGroup() + .addContainerGap() + .addComponent(jLabel12) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(prijemciVychozi, javax.swing.GroupLayout.DEFAULT_SIZE, 261, Short.MAX_VALUE) + .addContainerGap()) + ); + + jLabel1.setLabelFor(vstupPredmet); + jLabel1.setText("Předmět"); + + vstupPredmet.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + vstupPredmetActionPerformed(evt); + } + }); + + jLabel2.setText("Jméno odesílatele"); + + vstupZprava.setColumns(20); + vstupZprava.setRows(5); + jScrollPane1.setViewportView(vstupZprava); + + jLabel15.setText("Formát zprávy"); + + vstupFormatHTML.setMnemonic('h'); + vstupFormatHTML.setText("HTML"); + vstupFormatHTML.setToolTipText("Při nezaškrtnutí se odešle jako prostý text"); + + odpovedetKomuOdkaz.setForeground(javax.swing.UIManager.getDefaults().getColor("windowText")); + odpovedetKomuOdkaz.setMnemonic('e'); + odpovedetKomuOdkaz.setText("Adresa odesílatele"); + odpovedetKomuOdkaz.setToolTipText("

Klikněte sem pro nastavení adresy,

na kterou mají chodit odpovědi

"); + odpovedetKomuOdkaz.setClickedColor(javax.swing.UIManager.getDefaults().getColor("windowText")); + odpovedetKomuOdkaz.setUnclickedColor(javax.swing.UIManager.getDefaults().getColor("windowText")); + odpovedetKomuOdkaz.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + odpovedetKomuOdkazActionPerformed(evt); + } + }); + + javax.swing.GroupLayout panelZpravaLayout = new javax.swing.GroupLayout(panelZprava); + panelZprava.setLayout(panelZpravaLayout); + panelZpravaLayout.setHorizontalGroup( + panelZpravaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelZpravaLayout.createSequentialGroup() + .addContainerGap() + .addGroup(panelZpravaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 438, Short.MAX_VALUE) + .addGroup(panelZpravaLayout.createSequentialGroup() + .addGroup(panelZpravaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addGroup(panelZpravaLayout.createSequentialGroup() + .addGroup(panelZpravaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jLabel2) + .addComponent(jLabel1)) + .addGap(17, 17, 17)) + .addGroup(panelZpravaLayout.createSequentialGroup() + .addComponent(odpovedetKomuOdkaz, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED))) + .addGroup(panelZpravaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(vstupJmenoOdesilatele, javax.swing.GroupLayout.DEFAULT_SIZE, 328, Short.MAX_VALUE) + .addComponent(vstupAdresaOdesilatele, javax.swing.GroupLayout.DEFAULT_SIZE, 328, Short.MAX_VALUE) + .addComponent(vstupPredmet, javax.swing.GroupLayout.DEFAULT_SIZE, 328, Short.MAX_VALUE))) + .addGroup(javax.swing.GroupLayout.Alignment.LEADING, panelZpravaLayout.createSequentialGroup() + .addComponent(jLabel15) + .addGap(33, 33, 33) + .addComponent(vstupFormatHTML, javax.swing.GroupLayout.DEFAULT_SIZE, 81, Short.MAX_VALUE) + .addGap(247, 247, 247))) + .addContainerGap()) + ); + panelZpravaLayout.setVerticalGroup( + panelZpravaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(panelZpravaLayout.createSequentialGroup() + .addContainerGap() + .addGroup(panelZpravaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jLabel1) + .addComponent(vstupPredmet, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(panelZpravaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jLabel2) + .addComponent(vstupJmenoOdesilatele, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(panelZpravaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(vstupAdresaOdesilatele, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(odpovedetKomuOdkaz, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 184, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(panelZpravaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jLabel15) + .addComponent(vstupFormatHTML)) + .addContainerGap()) + ); + + odpovedetKomuDialog.setTitle("Adresa pro odpovědi"); + odpovedetKomuDialog.setModal(true); + + jLabel18.setText("Jméno"); + + jLabel19.setText("Adresa"); + + jLabel17.setText("\n

Pokud bude příjemce na hromadnou zprávu odpovídat,

\n

odpověď přijde na tuto adresu.

\n

Pokud tyto údaje nevyplníte, nebo zadáte chybný e-mail,

\n

budou odpovědi chodit odesílateli.

\n"); + + odpovedetKomuHotovo.setText("Hotovo"); + odpovedetKomuHotovo.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + odpovedetKomuHotovoActionPerformed(evt); + } + }); + + javax.swing.GroupLayout odpovedetKomuDialogLayout = new javax.swing.GroupLayout(odpovedetKomuDialog.getContentPane()); + odpovedetKomuDialog.getContentPane().setLayout(odpovedetKomuDialogLayout); + odpovedetKomuDialogLayout.setHorizontalGroup( + odpovedetKomuDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(odpovedetKomuDialogLayout.createSequentialGroup() + .addContainerGap() + .addGroup(odpovedetKomuDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(odpovedetKomuDialogLayout.createSequentialGroup() + .addGroup(odpovedetKomuDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jLabel19) + .addComponent(jLabel18)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(odpovedetKomuDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(odpovedetKomuAdresa, javax.swing.GroupLayout.DEFAULT_SIZE, 332, Short.MAX_VALUE) + .addComponent(odpovedetKomuJmeno, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 332, Short.MAX_VALUE))) + .addComponent(jLabel17, javax.swing.GroupLayout.DEFAULT_SIZE, 382, Short.MAX_VALUE) + .addComponent(odpovedetKomuHotovo, javax.swing.GroupLayout.Alignment.TRAILING)) + .addContainerGap()) + ); + odpovedetKomuDialogLayout.setVerticalGroup( + odpovedetKomuDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(odpovedetKomuDialogLayout.createSequentialGroup() + .addContainerGap() + .addGroup(odpovedetKomuDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jLabel18) + .addComponent(odpovedetKomuJmeno, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(odpovedetKomuDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(jLabel19) + .addComponent(odpovedetKomuAdresa, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jLabel17) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(odpovedetKomuHotovo) + .addContainerGap()) + ); + + setTitle("SuperPošťák"); + addWindowListener(new java.awt.event.WindowAdapter() { + public void windowClosing(java.awt.event.WindowEvent evt) { + formWindowClosing(evt); + } + }); + + jXHeader1.setDescription("Program pro posílání hromadných zpráv elektronickou poštou.\nNezneužívejte pro rozesílání spamu."); + jXHeader1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/frantovo/superPostak/obrazky/xfmail.png"))); // NOI18N + jXHeader1.setTitle("SuperPošťák"); + + taskPanel.setBackground(javax.swing.UIManager.getDefaults().getColor("Button.background")); + + jXTaskPane1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/frantovo/superPostak/obrazky/mail_generic.png"))); // NOI18N + jXTaskPane1.setTitle("Hromadná zpráva"); + + lnText.setMnemonic('z'); + lnText.setText("Text zprávy"); + lnText.setActionCommand("Zpráva"); + lnText.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + lnTextActionPerformed(evt); + } + }); + jXTaskPane1.getContentPane().add(lnText); + + lnPrijemci.setMnemonic('p'); + lnPrijemci.setText("Příjemci"); + lnPrijemci.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + lnPrijemciActionPerformed(evt); + } + }); + jXTaskPane1.getContentPane().add(lnPrijemci); + + lnOdeslat.setMnemonic('o'); + lnOdeslat.setText("Odeslat"); + lnOdeslat.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + lnOdeslatActionPerformed(evt); + } + }); + jXTaskPane1.getContentPane().add(lnOdeslat); + + taskPanel.add(jXTaskPane1); + + jXTaskPane2.setIcon(new javax.swing.ImageIcon(getClass().getResource("/cz/frantovo/superPostak/obrazky/gear.png"))); // NOI18N + jXTaskPane2.setTitle("Nastavení"); + + lnServer.setMnemonic('s'); + lnServer.setText("Poštovní server"); + lnServer.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + lnServerActionPerformed(evt); + } + }); + jXTaskPane2.getContentPane().add(lnServer); + + lnDatabaze.setMnemonic('d'); + lnDatabaze.setText("Databáze"); + lnDatabaze.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + lnDatabazeActionPerformed(evt); + } + }); + jXTaskPane2.getContentPane().add(lnDatabaze); + + lnVychoziPrijemci.setMnemonic('v'); + lnVychoziPrijemci.setText("Výchozí příjemci"); + lnVychoziPrijemci.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + lnVychoziPrijemciActionPerformed(evt); + } + }); + jXTaskPane2.getContentPane().add(lnVychoziPrijemci); + + taskPanel.add(jXTaskPane2); + + panel.setLayout(new java.awt.CardLayout()); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addComponent(taskPanel, javax.swing.GroupLayout.PREFERRED_SIZE, 196, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(panel, javax.swing.GroupLayout.DEFAULT_SIZE, 342, Short.MAX_VALUE)) + .addComponent(jXHeader1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 544, Short.MAX_VALUE) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addComponent(jXHeader1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(taskPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 340, Short.MAX_VALUE) + .addComponent(panel, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 340, Short.MAX_VALUE))) + ); + + pack(); + }//
//GEN-END:initComponents + private void vstupPredmetActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_vstupPredmetActionPerformed + +}//GEN-LAST:event_vstupPredmetActionPerformed + + private void lnTextActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_lnTextActionPerformed + setPanel(panelZprava); + }//GEN-LAST:event_lnTextActionPerformed + + private void lnPrijemciActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_lnPrijemciActionPerformed + setPanel(panelPrijemci); + }//GEN-LAST:event_lnPrijemciActionPerformed + + private void lnOdeslatActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_lnOdeslatActionPerformed + setPanel(panelOdeslat); + }//GEN-LAST:event_lnOdeslatActionPerformed + + private void lnServerActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_lnServerActionPerformed + setPanel(panelServer); + }//GEN-LAST:event_lnServerActionPerformed + + private void lnDatabazeActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_lnDatabazeActionPerformed + setPanel(panelDatabaze); + }//GEN-LAST:event_lnDatabazeActionPerformed + + private void lnVychoziPrijemciActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_lnVychoziPrijemciActionPerformed + setPanel(panelVychoziPrijemci); + }//GEN-LAST:event_lnVychoziPrijemciActionPerformed + + private void formWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosing + ulozNastaveni(); + log.log(Level.WARNING, "Ukončuji program."); + }//GEN-LAST:event_formWindowClosing + + /** + * Sestaví zprávu na základě GUI vstupů. Všechno kromě příjemců, + * ti se přidají až dodatečně, podle toho, + * jestli jde o zkušební nebo skutečné rozesílání. + */ + private HromadnaZprava getZprava() throws UnsupportedEncodingException { + HromadnaZprava zprava = new HromadnaZprava(); + zprava.setOdesilatel(new InternetAddress(vstupAdresaOdesilatele.getText(), vstupJmenoOdesilatele.getText())); + zprava.setPredmet(vstupPredmet.getText()); + zprava.setText(vstupZprava.getText()); + zprava.setFormatHTML(vstupFormatHTML.isSelected()); + + if (Postak.zkontrolujAdresu(odpovedetKomuAdresa.getText())) { + InternetAddress komu = new InternetAddress(); + komu.setPersonal(odpovedetKomuJmeno.getText()); + komu.setAddress(odpovedetKomuAdresa.getText()); + zprava.setOdpovedetKomu(komu); + } + + return zprava; + } + + /** Všichni příjemci, kterým bude odeslána ostrá zpráva. */ + private ArrayList getPrijemciVsichni() throws SQLException, UnsupportedEncodingException { + ArrayList vsichni = new ArrayList(); + Collection adresyVychozi = nastaveni.getVychoziPrijemci(); + Collection adresySQL = getPrijemciSQL(); + Collection adresyDodatecne = prijemciDodatecni.getAdresy(); + + if (adresyVychozi != null) { + vsichni.addAll(adresyVychozi); + } + if (adresySQL != null) { + vsichni.addAll(adresySQL); + } + if (adresyDodatecne != null) { + vsichni.addAll(adresyDodatecne); + } + return vsichni; + } + + private void rozeslatHromadnouZpravuTlacitkoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_rozeslatHromadnouZpravuTlacitkoActionPerformed + try { + ulozNastaveniGUI(); + HromadnaZprava zprava = getZprava(); + zprava.setPrijemci(getPrijemciVsichni()); + + 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); + if (volba == JOptionPane.YES_OPTION) { + odesli(zprava); + Postak.vypisPrijemce(zprava.getPrijemci()); + zobrazInformacniDialog("Odesláno", "Zpráva byla odeslána.\nPočet příjemců: " + zprava.getPrijemci().size(), true); + } + } catch (Exception e) { + zobrazChybovyDialog("Zprávu se nepodařilo odeslat", e, Level.SEVERE, true); + } +}//GEN-LAST:event_rozeslatHromadnouZpravuTlacitkoActionPerformed + + private void rozeslatZkusebniTlacitkoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_rozeslatZkusebniTlacitkoActionPerformed + try { + ulozNastaveniGUI(); + HromadnaZprava zprava = getZprava(); + zprava.setPrijemci(prijemciZkusebni.getAdresy()); + + odesli(zprava); + + zobrazInformacniDialog("Odesláno", "Zkušební zpráva byla odeslána.\nPočet adresátů: " + zprava.getPrijemci().size(), true); + } catch (Exception e) { + zobrazChybovyDialog("Zkušební zprávu se nepodařilo odeslat", e, Level.SEVERE, true); + } + }//GEN-LAST:event_rozeslatZkusebniTlacitkoActionPerformed + + private void vyzkousetPripojeniTlacitkoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_vyzkousetPripojeniTlacitkoActionPerformed + try { + getSpojeni();//GEN-LAST:event_vyzkousetPripojeniTlacitkoActionPerformed + zobrazInformacniDialog("Připojeno k DB", "Připojení k DB proběhlo úspěšně", false); + } catch (SQLException e) { + zobrazChybovyDialog("Spojení s DB", "Připojení k databázi selhalo", null, e, Level.SEVERE, true); + } + } + + private void vyzkousetSQLTlacitkoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_vyzkousetSQLTlacitkoActionPerformed + try { + Collection adresy = getPrijemciSQL();//GEN-LAST:event_vyzkousetSQLTlacitkoActionPerformed + if (adresy == null) { + zobrazInformacniDialog("SQL dotaz", "Dotaz do databáze neproběhl.\nSQL dotaz je prázdný.", false); + } else { + zobrazInformacniDialog("SQL dotaz", "Dotaz do databáze byl úspěšný.\nPočet získaných záznamů: " + adresy.size(), false); + } + } catch (Exception e) { + zobrazChybovyDialog("SQL dotaz", "Provedení SQL příkazu selhalo selhalo", null, e, Level.SEVERE, true); + } + } + + private void zobrazitSQLPrijemceTlacitkoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_zobrazitSQLPrijemceTlacitkoActionPerformed + try { + Collection adresy = getPrijemciSQL(); + + ZobrazovacAdres zobrazovac = new ZobrazovacAdres(this, false); + zobrazovac.setAdresy(adresy); + zobrazovac.setLocationRelativeTo(this); + zobrazovac.setVisible(true); + + } catch (Exception e) { + zobrazChybovyDialog("SQL dotaz", "Provedení SQL příkazu selhalo selhalo", null, e, Level.SEVERE, true); + } + }//GEN-LAST:event_zobrazitSQLPrijemceTlacitkoActionPerformed + + private void zobrazitVsechnyPrijemceTlacitkoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_zobrazitVsechnyPrijemceTlacitkoActionPerformed + try { + Collection adresy = getPrijemciVsichni(); + + ZobrazovacAdres zobrazovac = new ZobrazovacAdres(this, false); + zobrazovac.setAdresy(adresy); + zobrazovac.setLocationRelativeTo(this); + zobrazovac.setVisible(true); + + } catch (Exception e) { + zobrazChybovyDialog("SQL dotaz", "Provedení SQL příkazu selhalo selhalo", null, e, Level.SEVERE, true); + } + }//GEN-LAST:event_zobrazitVsechnyPrijemceTlacitkoActionPerformed + + private void odpovedetKomuOdkazActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_odpovedetKomuOdkazActionPerformed + odpovedetKomuDialog.pack(); + odpovedetKomuDialog.setLocationRelativeTo(this); + odpovedetKomuDialog.setModalityType(ModalityType.APPLICATION_MODAL); + odpovedetKomuDialog.getRootPane().setDefaultButton(odpovedetKomuHotovo); + odpovedetKomuDialog.setVisible(true); +}//GEN-LAST:event_odpovedetKomuOdkazActionPerformed + + private void odpovedetKomuHotovoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_odpovedetKomuHotovoActionPerformed + odpovedetKomuDialog.setVisible(false); +}//GEN-LAST:event_odpovedetKomuHotovoActionPerformed + + /** Provede uživatelem zadaný SQL dotaz a vrátí získané příjemce */ + private Collection getPrijemciSQL() throws SQLException, UnsupportedEncodingException { + if ("".equals(vstupSQL.getText())) { + return null; + } else { + return getSpojeni().getAdresy(vstupSQL.getText()); + } + } + + private DataSQL getSpojeni() throws SQLException { + return Data.getSpojeniSQL(vstupDatabaze.getText(), vstupDBjmeno.getText(), vstupDBheslo.getPassword()); + } + + /** Obalovací třída, která v průběhu odesílání zobrazuje kurzor s hodinami. */ + private void odesli(HromadnaZprava zprava) throws MessagingException { + setCursor(new Cursor(Cursor.WAIT_CURSOR)); + try { + postak.setNastaveni(nastaveni); + postak.odesli(zprava); + + } catch (MessagingException e) { + throw e; + } finally { + setCursor(Cursor.getDefaultCursor()); + } + } + + private void setPanel(JComponent komponenta) { + + if (panel.getLayout() instanceof CardLayout) { + CardLayout l = (CardLayout) panel.getLayout(); + l.show(panel, komponenta.getName()); + } else { + log.log(Level.WARNING, "Neplatí: panel.getLayout() instanceof CardLayout"); + } + + } + + /** Změní chování tabulátoru v textovém poli - aby se pomocí TABu dalo skočit na další komponentu */ + private void vyresitTabFocusProblem(JTextArea textArea) { + textArea.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, null); + textArea.setFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS, null); + } + + public JXTaskPaneContainer getTaskPanel() { + return taskPanel; + } + + /** + * @param args the command line arguments + */ + public static void main(String args[]) { + final boolean ladit = (args != null && args.length > 0 && args[0].equals("ladit")); + + /**try { + //LookAndFeel laf = UIManager.getLookAndFeel(); + + //laf = new SubstanceLookAndFeel(); + //laf = new SubstanceBusinessLookAndFeel(); + //laf = new SubstanceBusinessBlueSteelLookAndFeel(); + //laf = new SubstanceBusinessBlackSteelLookAndFeel(); + + UIManager.setLookAndFeel("org.jvnet.substance.skin.SubstanceBusinessBlueSteelLookAndFeel"); + } catch (ClassNotFoundException ex) { + log.log(Level.SEVERE, null, ex); + } catch (InstantiationException ex) { + log.log(Level.SEVERE, null, ex); + } catch (IllegalAccessException ex) { + log.log(Level.SEVERE, null, ex); + } catch (UnsupportedLookAndFeelException ex) { + log.log(Level.SEVERE, null, ex); + } */ + + java.awt.EventQueue.invokeLater(new Runnable() { + + public void run() { + new SuperPostak(ladit, true).setVisible(true); + } + }); + } + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JLabel jLabel1; + private javax.swing.JLabel jLabel10; + private javax.swing.JLabel jLabel11; + private javax.swing.JLabel jLabel12; + private javax.swing.JLabel jLabel13; + private javax.swing.JLabel jLabel14; + private javax.swing.JLabel jLabel15; + private javax.swing.JLabel jLabel16; + private javax.swing.JLabel jLabel17; + private javax.swing.JLabel jLabel18; + private javax.swing.JLabel jLabel19; + private javax.swing.JLabel jLabel2; + private javax.swing.JLabel jLabel4; + private javax.swing.JLabel jLabel5; + private javax.swing.JLabel jLabel6; + private javax.swing.JLabel jLabel7; + private javax.swing.JLabel jLabel8; + private javax.swing.JLabel jLabel9; + private javax.swing.JPanel jPanel1; + private javax.swing.JScrollPane jScrollPane1; + private javax.swing.JScrollPane jScrollPane3; + private javax.swing.JSeparator jSeparator1; + private javax.swing.JSeparator jSeparator2; + private org.jdesktop.swingx.JXHeader jXHeader1; + private org.jdesktop.swingx.JXTaskPane jXTaskPane1; + private org.jdesktop.swingx.JXTaskPane jXTaskPane2; + private org.jdesktop.swingx.JXHyperlink lnDatabaze; + private org.jdesktop.swingx.JXHyperlink lnOdeslat; + private org.jdesktop.swingx.JXHyperlink lnPrijemci; + private org.jdesktop.swingx.JXHyperlink lnServer; + private org.jdesktop.swingx.JXHyperlink lnText; + private org.jdesktop.swingx.JXHyperlink lnVychoziPrijemci; + private javax.swing.JTextArea napovedaSMTP; + private javax.swing.JScrollPane napovedaSMTPscroll; + private javax.swing.JTextField odpovedetKomuAdresa; + private javax.swing.JDialog odpovedetKomuDialog; + private javax.swing.JButton odpovedetKomuHotovo; + private javax.swing.JTextField odpovedetKomuJmeno; + private org.jdesktop.swingx.JXHyperlink odpovedetKomuOdkaz; + private org.jdesktop.swingx.JXPanel panel; + private org.jdesktop.swingx.JXPanel panelDatabaze; + private org.jdesktop.swingx.JXPanel panelOdeslat; + private org.jdesktop.swingx.JXPanel panelPrijemci; + private org.jdesktop.swingx.JXPanel panelServer; + private org.jdesktop.swingx.JXPanel panelVychoziPrijemci; + private org.jdesktop.swingx.JXPanel panelZprava; + private cz.frantovo.superPostak.PanelPrijemcu prijemciDodatecni; + private cz.frantovo.superPostak.PanelPrijemcu prijemciVychozi; + private cz.frantovo.superPostak.PanelPrijemcu prijemciZkusebni; + private javax.swing.JButton rozeslatHromadnouZpravuTlacitko; + private javax.swing.JButton rozeslatZkusebniTlacitko; + private org.jdesktop.swingx.JXTaskPaneContainer taskPanel; + private javax.swing.JTextField vstupAdresaOdesilatele; + private javax.swing.JPasswordField vstupDBheslo; + private javax.swing.JTextField vstupDBjmeno; + private javax.swing.JTextField vstupDatabaze; + private javax.swing.JCheckBox vstupFormatHTML; + private javax.swing.JTextField vstupJmenoOdesilatele; + private javax.swing.JTextField vstupPredmet; + private javax.swing.JPasswordField vstupSMTPheslo; + private javax.swing.JTextField vstupSMTPjmeno; + private javax.swing.JSpinner vstupSMTPlimitPrijemcu; + private javax.swing.JSpinner vstupSMTPport; + private javax.swing.JTextField vstupSMTPserver; + private javax.swing.JTextArea vstupSQL; + private javax.swing.JTextArea vstupZprava; + private javax.swing.JLabel vystupDBzprava; + private javax.swing.JLabel vystupSQLZprava; + private javax.swing.JButton vyzkousetPripojeniTlacitko; + private javax.swing.JButton vyzkousetSQLTlacitko; + private javax.swing.JButton zobrazitSQLPrijemceTlacitko; + private javax.swing.JButton zobrazitVsechnyPrijemceTlacitko; + // End of variables declaration//GEN-END:variables +} diff -r 000000000000 -r e76872ad5226 java/SuperPostak/src/cz/frantovo/superPostak/TODO.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/java/SuperPostak/src/cz/frantovo/superPostak/TODO.txt Sun Nov 23 22:19:20 2008 +0100 @@ -0,0 +1,30 @@ + Přidat dotaz - odsouhlasení před odesláním + Export adres + Import adres + Zobrazení adres + Editovatelnost seznamů (zapnuto/vypnuto) + SQL připojení + SQL načítání + Odesílací třída + HTML zprávy + SMTP přihlašování + SMTP SSL + Dělení na dávky +Obojetný formát zpráv: html + text + + + Kontrola vstupu: adresy se zavináčem, délky... +Inteligentní interpret chybových hlášek + +Nápověda u nastavení serveru +"O aplikaci" +Možnost neukládání hesla k DB, případně šifrování +Dokumentace - DocBook - JavaHelp + + +Odebírání více příjemců současně (multiselekt v tabulce) +automatické doplňování dříve napsaných textů (jména, adresy) +Řádek s logy - místo dialogů +Zvýrazňování SQL syntaxe + +Refaktoring JFTable \ No newline at end of file diff -r 000000000000 -r e76872ad5226 java/SuperPostak/src/cz/frantovo/superPostak/ZobrazovacAdres.form --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/java/SuperPostak/src/cz/frantovo/superPostak/ZobrazovacAdres.form Sun Nov 23 22:19:20 2008 +0100 @@ -0,0 +1,38 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff -r 000000000000 -r e76872ad5226 java/SuperPostak/src/cz/frantovo/superPostak/ZobrazovacAdres.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/java/SuperPostak/src/cz/frantovo/superPostak/ZobrazovacAdres.java Sun Nov 23 22:19:20 2008 +0100 @@ -0,0 +1,77 @@ +/* + * ZobrazovacAdres.java + * + * Created on 18. únor 2008, 0:13 + */ + +package cz.frantovo.superPostak; + +import cz.frantovo.postak.InternetAddressKomu; +import java.util.Collection; + +/** + * + * @author fiki + */ +public class ZobrazovacAdres extends javax.swing.JDialog { + + /** Creates new form ZobrazovacAdres */ + public ZobrazovacAdres(java.awt.Frame parent, boolean modal) { + super(parent, modal); + initComponents(); + panelAdres.setEditovatelny(false); + } + + public void setAdresy(Collection adresy) { + panelAdres.setAdresy(adresy); + } + + /** This method is called from within the constructor to + * initialize the form. + * WARNING: Do NOT modify this code. The content of this method is + * always regenerated by the Form Editor. + */ + // //GEN-BEGIN:initComponents + private void initComponents() { + + panelAdres = new cz.frantovo.superPostak.PanelPrijemcu(); + + setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); + setTitle("Seznam adres"); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(panelAdres, javax.swing.GroupLayout.DEFAULT_SIZE, 422, Short.MAX_VALUE) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(panelAdres, javax.swing.GroupLayout.DEFAULT_SIZE, 315, Short.MAX_VALUE) + ); + + pack(); + }// //GEN-END:initComponents + + /** + * @param args the command line arguments + */ + public static void main(String args[]) { + java.awt.EventQueue.invokeLater(new Runnable() { + public void run() { + ZobrazovacAdres dialog = new ZobrazovacAdres(new javax.swing.JFrame(), true); + dialog.addWindowListener(new java.awt.event.WindowAdapter() { + public void windowClosing(java.awt.event.WindowEvent e) { + System.exit(0); + } + }); + dialog.setVisible(true); + } + }); + } + + // Variables declaration - do not modify//GEN-BEGIN:variables + private cz.frantovo.superPostak.PanelPrijemcu panelAdres; + // End of variables declaration//GEN-END:variables + +} diff -r 000000000000 -r e76872ad5226 java/SuperPostak/src/cz/frantovo/superPostak/obrazky/adept_commit.png Binary file java/SuperPostak/src/cz/frantovo/superPostak/obrazky/adept_commit.png has changed diff -r 000000000000 -r e76872ad5226 java/SuperPostak/src/cz/frantovo/superPostak/obrazky/apply.png Binary file java/SuperPostak/src/cz/frantovo/superPostak/obrazky/apply.png has changed diff -r 000000000000 -r e76872ad5226 java/SuperPostak/src/cz/frantovo/superPostak/obrazky/editdelete.png Binary file java/SuperPostak/src/cz/frantovo/superPostak/obrazky/editdelete.png has changed diff -r 000000000000 -r e76872ad5226 java/SuperPostak/src/cz/frantovo/superPostak/obrazky/fork.png Binary file java/SuperPostak/src/cz/frantovo/superPostak/obrazky/fork.png has changed diff -r 000000000000 -r e76872ad5226 java/SuperPostak/src/cz/frantovo/superPostak/obrazky/gear.png Binary file java/SuperPostak/src/cz/frantovo/superPostak/obrazky/gear.png has changed diff -r 000000000000 -r e76872ad5226 java/SuperPostak/src/cz/frantovo/superPostak/obrazky/mail_generic.png Binary file java/SuperPostak/src/cz/frantovo/superPostak/obrazky/mail_generic.png has changed diff -r 000000000000 -r e76872ad5226 java/SuperPostak/src/cz/frantovo/superPostak/obrazky/otevrit.png Binary file java/SuperPostak/src/cz/frantovo/superPostak/obrazky/otevrit.png has changed diff -r 000000000000 -r e76872ad5226 java/SuperPostak/src/cz/frantovo/superPostak/obrazky/ulozit.png Binary file java/SuperPostak/src/cz/frantovo/superPostak/obrazky/ulozit.png has changed diff -r 000000000000 -r e76872ad5226 java/SuperPostak/src/cz/frantovo/superPostak/obrazky/vlozit.png Binary file java/SuperPostak/src/cz/frantovo/superPostak/obrazky/vlozit.png has changed diff -r 000000000000 -r e76872ad5226 java/SuperPostak/src/cz/frantovo/superPostak/obrazky/xfmail.png Binary file java/SuperPostak/src/cz/frantovo/superPostak/obrazky/xfmail.png has changed diff -r 000000000000 -r e76872ad5226 java/SuperPostak/src/cz/frantovo/superPostak/obrazky/zobrazit_adresy.png Binary file java/SuperPostak/src/cz/frantovo/superPostak/obrazky/zobrazit_adresy.png has changed diff -r 000000000000 -r e76872ad5226 java/SuperPostak/test/cz/frantovo/superPostak/PostakTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/java/SuperPostak/test/cz/frantovo/superPostak/PostakTest.java Sun Nov 23 22:19:20 2008 +0100 @@ -0,0 +1,31 @@ +package cz.frantovo.superPostak; + +import cz.frantovo.postak.Postak; +import org.junit.Test; +import static org.junit.Assert.*; + +/** + * @author fiki + */ +public class PostakTest { + + @Test + public void zkontrolujAdresu() { + System.out.println("zkontrolujAdresu"); + + String[] adresyDobre = {"abcd@example.com", "aa.bb@seznam.cz", "nbusr123@example.name", "VeLkA@pIsMeNa.COM"}; + String[] adresySpatne = {"adresaATexampleDOTcom", "nějaká adresa", "adresa @seznam.cz"}; + + for (String adresa : adresyDobre) { + System.out.println("Kontroluji: " + adresa); + assertEquals(true, Postak.zkontrolujAdresu(adresa)); + } + + System.out.println(); + + for (String adresa : adresySpatne) { + System.out.println("Kontroluji: " + adresa); + assertEquals(false, Postak.zkontrolujAdresu(adresa)); + } + } +}