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(),
"<br>", 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;
}
}