package uk.co.bytemark.vm.enigma.inquisition.gui.quizchooser;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import javax.swing.JCheckBox;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import uk.co.bytemark.vm.enigma.inquisition.gui.misc.QuizConfig;
import uk.co.bytemark.vm.enigma.inquisition.gui.screens.AbstractRenderAsHtmlDialog;
import uk.co.bytemark.vm.enigma.inquisition.misc.Constants;
import uk.co.bytemark.vm.enigma.inquisition.questions.QuestionSet;
import uk.co.bytemark.vm.enigma.inquisition.quiz.HTMLQuizRenderer;
public class RenderQuestionAsHtmlDialog extends AbstractRenderAsHtmlDialog {
private final QuestionSet questionSet;
public RenderQuestionAsHtmlDialog(Frame parent, QuestionSet questionSet) {
super(parent, true);
this.questionSet = questionSet;
getOkButton().setEnabled(false);
setUpListeners();
}
private void setUpListeners() {
getCancelButton().addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
dispose();
}
});
getOkButton().addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
boolean succeeded = writeHTML();
if (succeeded) {
dispose();
}
}
});
getChooseOutputFileButton().addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
chooseOutputFile();
}
});
getShowAnswersCheckBox().addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JCheckBox addLinksCheckBox = getAddLinksCheckBox();
boolean showAnswers = getShowAnswersCheckBox().isSelected();
addLinksCheckBox.setEnabled(showAnswers);
if (!showAnswers)
addLinksCheckBox.setSelected(false);
}
});
getOutputFileTextField().getDocument().addDocumentListener(new DocumentListener() {
public void changedUpdate(DocumentEvent e) {
outputTextFieldChanged();
}
public void insertUpdate(DocumentEvent e) {
outputTextFieldChanged();
}
public void removeUpdate(DocumentEvent e) {
outputTextFieldChanged();
}
});
}
private void outputTextFieldChanged() {
JTextField outputFileTextField = getOutputFileTextField();
boolean hasSomeText = !outputFileTextField.getText().equals("");
getOkButton().setEnabled(hasSomeText);
}
private boolean writeHTML() {
JTextField outputFileTextField = getOutputFileTextField();
boolean showAnswers = getShowAnswersCheckBox().isSelected();
boolean addLinks = getAddLinksCheckBox().isSelected();
File outputFile = new File(outputFileTextField.getText());
if (outputFile.exists()) {
int confirmStatus = JOptionPane.showConfirmDialog(this, "'" + outputFile.getAbsolutePath()
+ "' already exists. Do you want to overwrite it?", "Confirm Overwrite",
JOptionPane.OK_CANCEL_OPTION);
if (confirmStatus != JOptionPane.OK_OPTION) {
return false;
}
}
QuizConfig quizConfig = QuizConfig.createWithTimer(false, true, 30);
HTMLQuizRenderer quizRenderer = new HTMLQuizRenderer( quizConfig, showAnswers, false, addLinks);
String html = quizRenderer.asHtml(questionSet);
PrintWriter printWriter;
try {
printWriter = new PrintWriter(outputFile);
printWriter.write(html);
printWriter.close();
} catch (FileNotFoundException e) {
JOptionPane.showMessageDialog(this, "Could not export HTML to file '" + outputFile + "' due to error '"
+ e.getMessage() + "'", "Could not export HTML", JOptionPane.ERROR_MESSAGE);
return false;
}
JOptionPane.showMessageDialog(this, "Successfully exported questions as HTML to '" + outputFile,
" Exported Question Set as HTML ", JOptionPane.PLAIN_MESSAGE);
return true;
}
private void chooseOutputFile() {
JFileChooser fileChooser = new JFileChooser();
fileChooser.setDialogTitle("Export Question Set as HTML");
SuffixFileFilter.setSoleFileFilter(fileChooser, Constants.HTML_FILE_FILTER);
int resultStatus = fileChooser.showSaveDialog(this);
if (resultStatus == JFileChooser.APPROVE_OPTION) {
String htmlFileName = fileChooser.getSelectedFile().getAbsolutePath();
File htmlFile = new File(htmlFileName);
if (!Constants.HTML_FILE_FILTER.accept(htmlFile)) {
htmlFileName = Constants.HTML_FILE_FILTER.addSuffixTo(htmlFileName);
}
getOutputFileTextField().setText(htmlFileName);
}
}
}