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 java.io.IOException; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import javax.swing.Action; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.text.BadLocationException; import javax.swing.text.StyledEditorKit; import javax.swing.text.html.HTML; import javax.swing.text.html.HTMLDocument; 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(); cbTxtSize.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { int size = Integer.parseInt((String) cbTxtSize.getSelectedItem()); Action act = new StyledEditorKit.FontSizeAction(String.valueOf(size),size); act.actionPerformed(new ActionEvent(act,ActionEvent.ACTION_PERFORMED, (String)act.getValue(Action.ACTION_COMMAND_KEY))); } }); cbTxtColor.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { String color = (String) cbTxtColor.getSelectedItem(); Action act = null; switch(color) { case "Black": act = new StyledEditorKit.ForegroundAction("Black", Color.black); break; case "Blue": act = new StyledEditorKit.ForegroundAction("Blue", Color.blue); break; case "Yellow": act = new StyledEditorKit.ForegroundAction("Yellow", Color.yellow); break; case "Red": act = new StyledEditorKit.ForegroundAction("Red", Color.red); break; case "Green": act = new StyledEditorKit.ForegroundAction("Green", Color.green); break; } act.actionPerformed(new ActionEvent(act,ActionEvent.ACTION_PERFORMED, (String)act.getValue(Action.ACTION_COMMAND_KEY))); } }); btnWysiwyg.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { String tmp = txtDescription.getText(); if (txtDescription.getContentType().equals("text/html")) { txtDescription.setContentType("text/plain"); txtDescription.setText(tmp); btnWysiwyg.setText("Wysiwyg"); btnBold.setEnabled(false); btnUnderline.setEnabled(false); btnItalic.setEnabled(false); cbTxtColor.setEnabled(false); cbTxtSize.setEnabled(false); } else { txtDescription.setContentType("text/html"); txtDescription.setText(tmp); btnWysiwyg.setText("Html"); btnBold.setEnabled(true); btnUnderline.setEnabled(true); btnItalic.setEnabled(true); cbTxtColor.setEnabled(true); cbTxtSize.setEnabled(true); } } }); txtDescription.addKeyListener(new KeyListener() { @Override public void keyPressed(KeyEvent e) { } @Override public void keyTyped(KeyEvent e) { } @Override public void keyReleased(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_ENTER && txtDescription.getContentType().equals("text/html")) { try { kit.insertHTML((HTMLDocument) txtDescription.getDocument(), txtDescription.getCaretPosition(), "
", 0, 0, HTML.Tag.BR); txtDescription.setCaretPosition(txtDescription.getCaretPosition()); // This moves caret to next // line } catch (BadLocationException | IOException ex) { ex.printStackTrace(); } } } }); } @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; } }