package junit.swingui;

import java.awt.*;

import javax.swing.*;

/**
 * A panel with test run counters
 */
public class CounterPanel extends JPanel {
	private JTextField fNumberOfErrors;
	private JTextField fNumberOfFailures;
	private JTextField fNumberOfRuns;
	private Icon fFailureIcon= TestRunner.getIconResource(getClass(), "icons/failure.gif");
	private Icon fErrorIcon= TestRunner.getIconResource(getClass(), "icons/error.gif");

	private int fTotal;

	public CounterPanel() {
		super(new GridBagLayout());
		fNumberOfErrors= createOutputField(5);
		fNumberOfFailures= createOutputField(5);
		fNumberOfRuns= createOutputField(9);

      addToGrid(new JLabel("Runs:", JLabel.CENTER),
          0, 0, 1, 1, 0.0, 0.0,
          GridBagConstraints.CENTER, GridBagConstraints.NONE,
          new Insets(0, 0, 0, 0));
     addToGrid(fNumberOfRuns,
          1, 0, 1, 1, 0.33, 0.0,
          GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL,
          new Insets(0, 8, 0, 0));

     addToGrid(new JLabel("Errors:", fErrorIcon, SwingConstants.LEFT),
          2, 0, 1, 1, 0.0, 0.0,
          GridBagConstraints.CENTER, GridBagConstraints.NONE,
          new Insets(0, 8, 0, 0));
      addToGrid(fNumberOfErrors,
          3, 0, 1, 1, 0.33, 0.0,
          GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL,
          new Insets(0, 8, 0, 0));

      addToGrid(new JLabel("Failures:", fFailureIcon, SwingConstants.LEFT),
          4, 0, 1, 1, 0.0, 0.0,
          GridBagConstraints.CENTER, GridBagConstraints.NONE,
          new Insets(0, 8, 0, 0));
      addToGrid(fNumberOfFailures,
          5, 0, 1, 1, 0.33, 0.0,
          GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL,
          new Insets(0, 8, 0, 0));
	}

	private JTextField createOutputField(int width) {
		JTextField field= new JTextField("0", width);
		// force a fixed layout to avoid accidental hiding on relayout
		field.setMinimumSize(field.getPreferredSize());
		field.setMaximumSize(field.getPreferredSize());
		field.setHorizontalAlignment(JTextField.LEFT);
		field.setFont(StatusLine.BOLD_FONT);
		field.setEditable(false);
		field.setBorder(BorderFactory.createEmptyBorder());
		return field;
	}

	public void addToGrid(Component comp,
	    	int gridx, int gridy, int gridwidth, int gridheight,
			double weightx, double weighty,
			int anchor, int fill,
			Insets insets) {

		GridBagConstraints constraints= new GridBagConstraints();
		constraints.gridx= gridx;
		constraints.gridy= gridy;
		constraints.gridwidth= gridwidth;
		constraints.gridheight= gridheight;
		constraints.weightx= weightx;
		constraints.weighty= weighty;
		constraints.anchor= anchor;
		constraints.fill= fill;
		constraints.insets= insets;
		add(comp, constraints);
	}

	public void reset() {
		setLabelValue(fNumberOfErrors, 0);
		setLabelValue(fNumberOfFailures, 0);
		setLabelValue(fNumberOfRuns, 0);
		fTotal= 0;
	}

	public void setTotal(int value) {
		fTotal= value;
	}

	public void setRunValue(int value) {
		fNumberOfRuns.setText(Integer.toString(value) + "/" + fTotal);
	}

	public void setErrorValue(int value) {
		setLabelValue(fNumberOfErrors, value);
	}

	public void setFailureValue(int value) {
		setLabelValue(fNumberOfFailures, value);
	}

	private void setLabelValue(JTextField label, int value) {
		label.setText(Integer.toString(value));
	}
}