/*
 *	Modulname:	RendererYesNo
 *	Autor:		Eyer Leander
 *	Datum:		08.05.2006
 *
 *	(c) Copyright 2005
 */
package survey.gui;

import survey.Survey;
import survey.model.Question;
import survey.model.TypeYesNo;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.Iterator;
import java.util.Vector;

/**
 * A renderer for multiple choice questions
 */
public class RendererYesNo extends Renderer implements ItemListener {

	// connection to the model
	private TypeYesNo type;

	private JLabel questionLabel;
	private JPanel answerPane;

	// radio buttons
	private Vector<JRadioButton> radioButtons = new Vector<JRadioButton>();

	/** Constructor */
	public RendererYesNo(Question element, TypeYesNo type) {
		super(element);
		this.type = type;

		createUI();
		setEditable(getQuestion().isEditable());
	}

	/** Config the user interface */
	private void createUI() {
		String mandatoryFlag = getQuestion().isMandatory()? "* ":"";
		questionLabel = new JLabel("<html><body>" + mandatoryFlag + getQuestion().getLabel() + "</body></html>");
        questionLabel.setFont(Survey.FONT_QUESTION_TEXT);

		ButtonGroup group = new ButtonGroup();
		answerPane = new JPanel(new GridLayout(1, 0, 6, 6));

		Vector<String> labels = new Vector<String>();
		labels.add("Yes");
		labels.add("No");
		Iterator<String> it = labels.iterator();
		while (it.hasNext()) {
			JRadioButton button = new JRadioButton(it.next());
			button.setFont(Survey.FONT_QUESTION_ANSWER);
            button.addItemListener(this);

			group.add(button);
			answerPane.add(button);

			radioButtons.add(button);
		}

		setLayout(new BorderLayout(24, 24));
		add(questionLabel, BorderLayout.CENTER);
		add(answerPane, BorderLayout.EAST);
	}

	/**
	 * Invoked when an item has been selected or deselected by the user.
	 * The code written for this method performs the operations
	 * that need to occur when an item is selected (or deselected).
	 */
	public void itemStateChanged(ItemEvent e) {
		// we only look at selec events
    	if (e.getStateChange() == ItemEvent.DESELECTED) {
			return;
		}

		if (radioButtons.get(0).isSelected())
			type.setAnswer("yes");
		else
			type.setAnswer("no");
	}

	/**
	 * Update the question state (i.e. after a model element has been set programatically)
	 */
	public void updateRenderer() {
        String answer = (String) type.getAnswer();
		if ((answer != null) && (answer.equalsIgnoreCase("yes"))) {
			radioButtons.get(0).setSelected(true);
		} else {
			radioButtons.get(1).setSelected(true);
		}

	}

	/**
	 * Change the Editable property
	 */
	public void setEditable(boolean editable) {
		for (JRadioButton btn:radioButtons) {
			btn.setEnabled(editable);
		}
	}

	/**
	 * Get the preferred width of the question label
	 */
	public double getLabelWidth() {
		return questionLabel.getPreferredSize().width;
	}

	/**
	 * Set the width of the question label
	 */
	public void setLabelWidth(double width) {
		Dimension d = new Dimension((int) width, questionLabel.getPreferredSize().height);
		questionLabel.setMinimumSize(d);
		questionLabel.setPreferredSize(d);
		questionLabel.setMaximumSize(d);
	}

	/**
	 * Get the size of the answer space
	 */
	public double getAnswerSpaceWidth() {
		return answerPane.getPreferredSize().width;
	}

	/**
	 * Set the answer space width
	 */
	public void setAnswerSpaceWdith(double width) {
		Dimension d = new Dimension((int) width, answerPane.getPreferredSize().height);
		answerPane.setMinimumSize(d);
		answerPane.setPreferredSize(d);
		answerPane.setMaximumSize(d);
	}

}

