package op.settings.subpanels; import entity.EntityTools; import entity.system.SYSPropsTools; import entity.system.Users; import entity.system.UsersTools; import gui.PnlBeanEditor; import gui.events.RelaxedDocumentListener; import gui.interfaces.BoundedTextField; import gui.interfaces.DefaultPanel; import gui.interfaces.YesNoToggleButton; import gui.parser.IntegerParser; import op.OPDE; import op.settings.databeans.PersonalMailBean; import op.system.EMailSystem; import op.system.Recipient; import op.threads.DisplayMessage; import op.tools.SYSConst; import op.tools.SYSTools; import org.apache.log4j.Logger; import javax.swing.*; import javax.swing.text.BadLocationException; import javax.validation.ConstraintViolation; import javax.validation.ConstraintViolationException; import java.awt.*; import java.awt.event.ItemEvent; import java.lang.reflect.InvocationTargetException; import java.sql.SQLIntegrityConstraintViolationException; import java.text.ParseException; import java.util.Random; import java.util.concurrent.ExecutionException; /** * Created by tloehr on 11.07.15. */ public class PnlUserMailSettings extends DefaultPanel { boolean checkInProgress = false; boolean lastCheckOk = false; Logger logger = Logger.getLogger(getClass()); String mailaddress = ""; boolean keyConfirmed = false; final JLabel lblLED = new JLabel(); final YesNoToggleButton tbNotifications; public PnlUserMailSettings() { super("opde.settings.personal.mail"); setLayout(new BoxLayout(this, BoxLayout.X_AXIS)); keyConfirmed = OPDE.getLogin().getUser().getMailConfirmed() >= UsersTools.MAIL_CONFIRMED; lblLED.setIcon(keyConfirmed ? SYSConst.icon22ledGreenOn : SYSConst.icon22ledRedOn); tbNotifications = new YesNoToggleButton("opde.settings.personal.enable.notification", "opde.settings.personal.disable.notification", OPDE.getLogin().getUser().getMailConfirmed() == UsersTools.MAIL_NOTIFICATIONS_ENABLED); tbNotifications.setEnabled(keyConfirmed); try { final PnlBeanEditor<PersonalMailBean> pbe = new PnlBeanEditor<>(() -> new PersonalMailBean(OPDE.getLogin().getUser()), PersonalMailBean.class); pbe.setCustomPanel(getButtonPanel(pbe)); pbe.addDataChangeListener(evt -> mailaddress = evt.getData().getMail()); add(pbe); } catch (Exception e) { OPDE.fatal(logger, e); } tbNotifications.addItemListener(ie -> { if (ie.getStateChange() != ItemEvent.SELECTED && ie.getStateChange() != ItemEvent.DESELECTED) return; Users myUser = OPDE.getLogin().getUser(); myUser.setMailConfirmed(ie.getStateChange() == ItemEvent.SELECTED ? UsersTools.MAIL_NOTIFICATIONS_ENABLED : UsersTools.MAIL_CONFIRMED); OPDE.getLogin().setUser(EntityTools.merge(myUser)); }); } private JPanel getButtonPanel(PnlBeanEditor<PersonalMailBean> pbe) { final JButton btnTestmail = new JButton(SYSTools.xx("opde.settings.global.mail.sendtest")); btnTestmail.addActionListener(e -> { try { if (checkInProgress) return; checkInProgress = true; pbe.broadcast(); OPDE.getDisplayManager().addSubMessage(new DisplayMessage("opde.settings.personal.mail.testing")); SwingWorker worker = new SwingWorker() { @Override protected Object doInBackground() { lastCheckOk = false; keyConfirmed = false; tbNotifications.setEnabled(keyConfirmed); lblLED.setIcon(SYSConst.icon22ledRedOn); Users myUser = OPDE.getLogin().getUser(); myUser.setMailConfirmed(UsersTools.MAIL_UNCONFIRMED); OPDE.getLogin().setUser(EntityTools.merge(myUser)); Random generator = new Random(System.currentTimeMillis()); String testkey = SYSTools.padL(Integer.toString(generator.nextInt(9999)), 4, "0"); SYSPropsTools.storeProp(SYSPropsTools.KEY_MAIL_TESTKEY, testkey, OPDE.getLogin().getUser()); // this key is always stored centrally in the system's properties. it belongs to the current user. return EMailSystem.sendMail(SYSTools.xx("opde.settings.global.mail.testsubject"), SYSTools.xx("opde.settings.personal.confirmmail.testbody") + "<br/>" + SYSConst.html_h2(SYSTools.xx("opde.settings.personal.mail.key") + ": " + testkey), new Recipient(mailaddress.trim(), OPDE.getLogin().getUser().getFullname()), null); } @Override protected void done() { checkInProgress = false; try { lastCheckOk = (Boolean) get(); if (lastCheckOk) { Users myUser = OPDE.getLogin().getUser(); myUser.setEMail(mailaddress); myUser.setMailConfirmed(UsersTools.MAIL_UNCONFIRMED); OPDE.getLogin().setUser(EntityTools.merge(myUser)); } else { OPDE.getDisplayManager().addSubMessage(new DisplayMessage("opde.settings.personal.mail.fail", DisplayMessage.WARNING)); } } catch (InterruptedException e1) { lastCheckOk = false; OPDE.warn(logger, e1); } catch (ExecutionException e1) { lastCheckOk = false; OPDE.warn(logger, e1); } } }; worker.execute(); } catch (ConstraintViolationException cve) { String violations = ""; for (ConstraintViolation cv : cve.getConstraintViolations()) { violations += cv.getMessage() + "; "; } OPDE.getDisplayManager().addSubMessage(new DisplayMessage(violations, DisplayMessage.WARNING)); } catch (InvocationTargetException e1) { e1.printStackTrace(); } catch (NoSuchMethodException e1) { e1.printStackTrace(); } catch (IllegalAccessException e1) { e1.printStackTrace(); } catch (SQLIntegrityConstraintViolationException e1) { e1.printStackTrace(); } reload(); }); lblLED.setText(SYSTools.xx("opde.settings.personal.mail.key")); BoundedTextField btf = new BoundedTextField(4, 4); btf.setText(OPDE.getLogin().getUser().getMailConfirmed() == UsersTools.MAIL_UNCONFIRMED ? "" : OPDE.getProps().getProperty(SYSPropsTools.KEY_MAIL_TESTKEY)); // btf.getDocument().insertString(0, SYSTools.catchNull(OPDE.getProps().getProperty(SYSPropsTools.KEY_MAIL_TESTKEY)), null); btf.getDocument().addDocumentListener(new RelaxedDocumentListener(var1 -> { try { if (!OPDE.getProps().containsKey(SYSPropsTools.KEY_MAIL_TESTKEY)) return; String text = var1.getDocument().getText(0, var1.getDocument().getLength()); IntegerParser parser = new IntegerParser(); parser.parse(text); keyConfirmed = text.equals(OPDE.getProps().getProperty(SYSPropsTools.KEY_MAIL_TESTKEY)); tbNotifications.setEnabled(keyConfirmed); lblLED.setIcon(keyConfirmed ? SYSConst.icon22ledGreenOn : SYSConst.icon22ledRedOn); OPDE.getDisplayManager().addSubMessage(new DisplayMessage(keyConfirmed ? "opde.settings.personal.mail.confirmed" : "opde.settings.personal.mail.not.confirmed")); if (keyConfirmed) { Users myUser = OPDE.getLogin().getUser(); myUser.setMailConfirmed(UsersTools.MAIL_CONFIRMED); OPDE.getLogin().setUser(EntityTools.merge(myUser)); } } catch (ParseException e) { e.printStackTrace(); } catch (BadLocationException e) { e.printStackTrace(); } })); Box line1 = Box.createHorizontalBox(); line1.add(btnTestmail); line1.add(Box.createRigidArea(new Dimension(50, 00))); line1.add(lblLED); line1.add(Box.createHorizontalStrut(5)); line1.add(btf); line1.add(Box.createHorizontalGlue()); // Box line2 = Box.createHorizontalBox(); // line2.add(lbl); // line2.add(Box.createRigidArea(new Dimension(50, 00))); // line2.add(lblLED); // line2.add(Box.createHorizontalStrut(5)); // line2.add(btf); // line2.add(Box.createHorizontalGlue()); // line.add(Box.createHorizontalGlue()); // line.add(tbActive); Box page = Box.createVerticalBox(); page.add(Box.createRigidArea(new Dimension(0, 10))); page.add(new JSeparator()); page.add(Box.createRigidArea(new Dimension(0, 10))); page.add(line1); page.add(Box.createRigidArea(new Dimension(0, 10))); page.add(tbNotifications); page.add(Box.createVerticalGlue()); JPanel content = new JPanel(); content.setLayout(new BoxLayout(content, BoxLayout.PAGE_AXIS)); content.add(page); return content; } }