package edu.gui.components;
import edu.exceptions.GuiException;
import edu.gui.Observer;
import edu.gui.QuestionTypeGui;
import edu.gui.Subject;
import edu.parser.QL.nodes.question.Question;
import javax.swing.*;
import java.awt.*;
import java.lang.reflect.InvocationTargetException;
import java.util.List;
/**
* Created by Steven Kok on 25/02/2015.
*/
public class QuestionsPanel extends JPanel {
private final GridBagConstraints gbc;
private final List<Question> questions;
private final Observer questionState;
public QuestionsPanel(List<Question> questions, Observer questionState) {
this.questionState = questionState;
this.questions = questions;
gbc = new GridBagConstraints();
initializeGridBagLayout();
addQuestionsToGridBagLayout();
}
private void initializeGridBagLayout() {
setLayout(new GridBagLayout());
gbc.gridx = 0;
gbc.gridy = 0;
gbc.insets = new Insets(2, 5, 2, 5); // padding
gbc.weightx = gbc.weighty = 1.0; // fill available space
}
private void addQuestionsToGridBagLayout() {
questions.stream()
.forEachOrdered(this::addQuestionToGridBagLayout);
}
private void addQuestionToGridBagLayout(Question question) {
gbc.gridx = 0;
gbc.anchor = GridBagConstraints.WEST;
addLabel(question);
gbc.gridx++;
gbc.anchor = GridBagConstraints.EAST;
addInputField(question);
gbc.gridy++;
}
private void addLabel(Question question) {
String label = question.getLabel().getLabel();
add(new JLabel(label), gbc);
}
private void addInputField(Question question) {
Subject component = getComponent(question);
component.registerObserver(questionState);
add(component.getComponent(), gbc);
}
private Subject getComponent(Question question) {
try {
Class<? extends Subject> component = QuestionTypeGui.getComponent(question.getQuestionType());
return component.getDeclaredConstructor(Question.class).newInstance(question);
} catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
throw new GuiException(e);
}
}
}