//------------------------------------------------------------------------------
// Copyright (c) 2005, 2006 IBM Corporation and others.
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0
// which accompanies this distribution, and is available at
// http://www.eclipse.org/legal/epl-v10.html
//
// Contributors:
// IBM Corporation - initial implementation
//------------------------------------------------------------------------------
package org.eclipse.epf.library.edit.command;

import java.util.List;

import org.eclipse.epf.library.edit.validation.IValidator;
import org.eclipse.jface.viewers.ILabelProvider;

/**
 * Class that keeps the information about the input request and reference to the
 * input user specified or selected
 * 
 * @author Phong Nguyen Le
 * @since 1.0
 */
public class UserInput {
	public static final int TEXT = 0;

	public static final int SELECTION = 1;

	private String label;

	private int type;

	private boolean multiple;

	private List choices;

	private Object input;

	private ILabelProvider labelProvider;

	private Object context;

	private IValidator validator;

	public UserInput(String label, int type, boolean multiple, List choices,
			ILabelProvider labelProvider, Object context) {
		this(label, type, multiple, choices, labelProvider, null, context);
	}

	/**
	 * @param label
	 * @param type
	 * @param multiple
	 * @param choices
	 * @param labelProvider
	 *            the label provider to represent the element in the
	 *            <code>choices</code> list or <code>null</code> if
	 *            <code>choices</code> list is <code>null</code>
	 * @param validator
	 *            the validator to validate the input
	 * @param context
	 *            the context of the user input that is command-specific and can
	 *            contain addional information about the user input.
	 */
	public UserInput(String label, int type, boolean multiple, List choices,
			ILabelProvider labelProvider, IValidator validator, Object context) {
		super();
		this.label = label;
		this.type = type;
		this.multiple = multiple;
		this.choices = choices;
		this.labelProvider = labelProvider;
		this.validator = validator;
		this.context = context;
	}

	public Object getInput() {
		return input;
	}

	public void setInput(Object input) {
		this.input = input;
	}

	public List getChoices() {
		return choices;
	}

	public String getLabel() {
		return label;
	}

	public boolean isMultiple() {
		return multiple;
	}

	public int getType() {
		return type;
	}

	/**
	 * Gets the label provider
	 * 
	 * @return the label provider
	 */
	public ILabelProvider getLabelProvider() {
		return labelProvider;
	}
	
	/**
	 * Gets the validator
	 * 
	 * @return the validator
	 */
	public IValidator getValidator() {
		return validator;
	}

	/**
	 * Gets the context of this user input
	 * 
	 * @return the context
	 */
	public Object getContext() {
		return context;
	}
}
