package org.openslx.dozmod.gui.wizard.page; import java.awt.Color; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Date; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import org.apache.log4j.Logger; import org.openslx.dozmod.gui.helper.DateTimeHelper; import org.openslx.dozmod.gui.helper.TextChangeListener; import org.openslx.dozmod.gui.wizard.Wizard; import org.openslx.dozmod.gui.wizard.layout.LectureCreationPageLayout; import org.openslx.dozmod.state.LectureWizardState; import org.openslx.dozmod.thrift.Session; import org.openslx.dozmod.util.FormatHelper; /** * First page for creating a new lecture. * Used to set name, description and start- and endtime */ @SuppressWarnings("serial") public class LectureCreationPage extends LectureCreationPageLayout { private final static Logger LOGGER = Logger.getLogger(LectureCreationPage.class); private LectureWizardState state = null; /** * Page for creating lectures */ public LectureCreationPage(Wizard wizard, LectureWizardState state) { super(wizard, state.image != null ? state.image.imageName : "Neu"); this.state = state; // listener for the text fields final TextChangeListener docListener = new TextChangeListener() { @Override public void changed() { reactToUserInput(); } }; txtName.getDocument().addDocumentListener(docListener); txtDescription.getDocument().addDocumentListener(docListener); // listeners for the date pickers final ActionListener actionListener = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { reactToUserInput(); } }; // listeners for the time pickers final ChangeListener changeListener = new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { reactToUserInput(); } }; spnStartTime.addChangeListener(changeListener); spnEndTime.addChangeListener(changeListener); dtpStartDate.addActionListener(actionListener); dtpEndDate.addActionListener(actionListener); calculateDatePeriod(); } @Override protected boolean wantNextOrFinish() { return reactToUserInput(); } /** * Called by event listeners. This will set guidance message or error * message and call setPageComplete(bool) accordingly. * The state will be updated if the fields are valid. */ private boolean reactToUserInput() { boolean b = isPageValid(); calculateDatePeriod(); setPageComplete(b); return b; } /** * Calculate the days between the selected dates and update the * corresponding label. */ private void calculateDatePeriod() { Date start = DateTimeHelper.getDateFrom(dtpStartDate, spnStartTime); Date end = DateTimeHelper.getDateFrom(dtpEndDate, spnEndTime); if (end.before(start)) { lblCalcPeriod.setText("Endzeitpunkt ist vor Startzeitpunkt!"); } else { int numberOfDays = DateTimeHelper.calculatePeriodInDays(start, end); lblCalcPeriod.setText(numberOfDays + "Tag(e)"); lblCalcPeriod.setForeground(numberOfDays < 7 ? Color.RED : null); } } private boolean isPageValid() { if (txtName.getText().isEmpty()) { setWarningMessage("Geben Sie einen Veranstaltungsnamen ein."); return false; } else { state.name = txtName.getText(); } if (txtDescription.getText().isEmpty()) { setWarningMessage("Fügen Sie eine Beschreibung hinzu."); return false; } else { state.description = txtDescription.getText(); } final Date now = new Date(); final Date start = DateTimeHelper.getDateFrom(dtpStartDate, spnStartTime); final Date end = DateTimeHelper.getDateFrom(dtpEndDate, spnEndTime); if (start.after(end)) { setWarningMessage("Startzeit ist nach Endzeit!"); return false; } else if (now.after(end)) { setWarningMessage("Endzeit liegt in die Vergangenheit!"); return false; } else { int validityPeriod = Session.getSatelliteConfig().getMaxLectureValidityDays(); Date validityPeriodEnd = DateTimeHelper.addDaysTo(start, validityPeriod); // all good, save them both if (end.after(validityPeriodEnd)) { setWarningMessage("Endzeit liegt nach dem spätest möglichen Datum: " + FormatHelper.shortDate(validityPeriodEnd.getTime() / 1000L)); return false; } else { state.start = start; state.end = end; } } String nextText; nextText = state.image == null ? ", um eine Virtuelle Maschine auszuwählen" : " für Berechtigungen oder 'Fertigstellen'."; setDescription("Klicken Sie auf 'Weiter' " + nextText); return true; } }