package edu.vserver.exercises.math.essentials.level;
import java.util.ArrayList;
import java.util.List;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.CssLayout;
import com.vaadin.ui.Label;
import com.vaadin.ui.Layout;
import edu.vserver.misconception.MisconceptionPerformanceSubject;
import fi.utu.ville.exercises.helpers.ExerciseExecutionHelper;
import fi.utu.ville.exercises.helpers.VilleErrorReporter;
import fi.utu.ville.exercises.model.ExecutionSettings;
import fi.utu.ville.exercises.model.ExecutionState;
import fi.utu.ville.exercises.model.ExecutionStateChangeListener;
import fi.utu.ville.exercises.model.Executor;
import fi.utu.ville.exercises.model.ExerciseData;
import fi.utu.ville.exercises.model.ExerciseException;
import fi.utu.ville.exercises.model.ResetListener;
import fi.utu.ville.exercises.model.SubmissionListener;
import fi.utu.ville.exercises.model.SubmissionType;
import fi.utu.ville.standardutils.Localizer;
import fi.utu.ville.standardutils.MathIcons;
import fi.utu.ville.standardutils.MathUIFactory;
import fi.utu.ville.standardutils.StandardUIConstants;
import fi.utu.ville.standardutils.StandardUIFactory;
import fi.utu.ville.standardutils.TempFilesManager;
import fi.utu.ville.standardutils.UIConstants;
public class LevelMathExecutorWrapper<E extends ExerciseData, S extends LevelSubmissionInfo>
extends CssLayout implements Executor<LevelMathDataWrapper<E>, S> {
/**
*
*/
private static final long serialVersionUID = -7363354799686763767L;
private final Executor<E, S> realExecutor;
private LevelMathDataWrapper<E> allLevels;
private S submInfo;
private boolean initialized = false;
private boolean levelSelected = false;
private int difficultyIndicator = 0;
private final ExerciseExecutionHelper<S> realListeners = new ExerciseExecutionHelper<>();
public LevelMathExecutorWrapper(Executor<E, S> realExecutor) {
super();
this.realExecutor = realExecutor;
}
private Button easy;
private Button normal;
private Button hard;
private Localizer localizer;
private ExecutionSettings execSettings;
private final ClickListener cl = new ClickListener() {
private static final long serialVersionUID = 4026684080223114316L;
@Override
public void buttonClick(ClickEvent event) {
final DiffLevel usedLevel;
levelSelected = true;
if (event.getButton().equals(easy)) {
usedLevel = DiffLevel.EASY;
difficultyIndicator = 1;
} else if (event.getButton().equals(normal)) {
usedLevel = DiffLevel.NORMAL;
difficultyIndicator = 2;
} else {
usedLevel = DiffLevel.HARD;
difficultyIndicator = 3;
}
loadRealExercise(usedLevel);
realExecutor.registerResetListener(() -> {
realListeners.informResetDefault();
});
realExecutor.registerSubmitListener(submission -> {
submission.getSubmissionInfo().setDiffLevel(usedLevel);
realListeners.informOnlySubmit(submission);
});
}
};
@Override
public void initialize(Localizer localizer, LevelMathDataWrapper<E> data,
S submInfo, TempFilesManager tempMan, ExecutionSettings execSettings) {
this.execSettings = execSettings;
this.localizer = localizer;
this.submInfo = submInfo;
allLevels = data;
easy = MathUIFactory.getStarButton(
localizer.getUIText(UIConstants.LEVEL_EASY), localizer);
easy.setIcon(MathIcons.getIcon(MathIcons.STAR_EASY));
easy.setId("math-easy");
normal = MathUIFactory.getStarButton(
localizer.getUIText(UIConstants.LEVEL_NORMAL), localizer);
normal.setIcon(MathIcons.getIcon(MathIcons.STAR_NORMAL));
normal.setId("math-normal");
hard = MathUIFactory.getStarButton(
localizer.getUIText(UIConstants.LEVEL_HARD), localizer);
hard.setIcon(MathIcons.getIcon(MathIcons.STAR_HARD));
hard.setId("math-hard");
List<Button> buttonList = new ArrayList<>();
buttonList.add(easy);
buttonList.add(normal);
buttonList.add(hard);
CssLayout buttons = new CssLayout();
buttons.setStyleName("math-levelbutton-wrapper");
buttonList.forEach(b -> {
b.addClickListener(cl);
b.addStyleName("math-levelbutton");
buttons.addComponent(b);
});
Label header = new Label(localizer.getUIText(UIConstants.CHOOSE_LEVEL));
header.addStyleName("math-h1");
header.setSizeUndefined();
addComponents(header, buttons);
}
@Override
public void attach() {
super.attach();
addStyleName("level-math-executor-wrapper");
}
private void loadRealExercise(DiffLevel corrLevel) {
removeAllComponents();
initialized = true;
realListeners.getState().setCanReset(true);
realListeners.getState().setCanSubmit(true);
realListeners.informStateListeners();
try {
realExecutor.initialize(localizer,
allLevels.getForLevel(corrLevel), submInfo, null,
execSettings);
addComponent(realExecutor.getView());
} catch (ExerciseException e) {
realListeners.getState().setCanReset(false);
realListeners.getState().setCanSubmit(false);
realListeners.informStateListeners();
VilleErrorReporter.reportByMail("", e);
addComponent(StandardUIFactory.getWarningPanel(localizer
.getUIText(StandardUIConstants.EXERCISE_LOAD_ERROR)));
}
}
@Override
public void registerSubmitListener(SubmissionListener<S> submitListener) {
realListeners.registerSubmitListener(submitListener);
}
@Override
public void registerResetListener(ResetListener resetListener) {
realListeners.registerResetListener(resetListener);
}
@Override
public Layout getView() {
return this;
}
@Override
public void shutdown() {
if (initialized) {
realExecutor.shutdown();
}
}
@Override
public void askReset() {
if (levelSelected) {
realExecutor.askReset();
}
}
@Override
public void askSubmit(SubmissionType submtype) {
if (levelSelected) {
realExecutor.askSubmit(submtype);
}
}
@Override
public void registerExecutionStateChangeListener(
ExecutionStateChangeListener execStateListener) {
realListeners.registerExerciseExecutionStateListener(execStateListener);
realExecutor.registerExecutionStateChangeListener(execStateListener);
if (!initialized) {
realListeners.getState().setCanReset(false);
realListeners.getState().setCanSubmit(false);
realListeners.informStateListeners();
}
}
@Override
public ExecutionState getCurrentExecutionState() {
return realExecutor.getCurrentExecutionState();
}
@Override
public void setMisconceptionSubject(
MisconceptionPerformanceSubject misconceptionSubject) {
realExecutor.setMisconceptionSubject(misconceptionSubject);
}
@Override
public MisconceptionPerformanceSubject getMisconceptionSubject() {
return realExecutor.getMisconceptionSubject();
}
public void setHardButtonEnabled(boolean value) {
hard.setEnabled(value);
}
/**
*
* @return 1 = easy, 2 = medium, 3 = hard
*/
public int getDifficulty() {
return difficultyIndicator;
}
}