/*******************************************************************************
 * Copyright (c) 2000, 2001, 2002 International Business Machines Corp. and others.
 * All rights reserved. This program and the accompanying materials 
 * are made available under the terms of the Common Public License v0.5 
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/cpl-v05.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 ******************************************************************************/
package net.sourceforge.phpdt.internal.compiler;

/**
 * Generic option description, which can be modified independently from the
 * component it belongs to.
 * 
 * @deprecated backport 1.0 internal functionality
 */

import java.util.Locale;
import java.util.MissingResourceException;
import java.util.NoSuchElementException;
import java.util.ResourceBundle;
import java.util.StringTokenizer;

public class ConfigurableOption {
	private String componentName;

	private String optionName;

	private int id;

	private String category;

	private String name;

	private String description;

	private int currentValueIndex;

	private int defaultValueIndex;

	private String[] possibleValues;

	// special value for <possibleValues> indicating that
	// the <currentValueIndex> is the actual value
	public final static String[] NoDiscreteValue = {};

	/**
	 * INTERNAL USE ONLY
	 * 
	 * Initialize an instance of this class according to a specific locale
	 * 
	 * @param loc
	 *            java.util.Locale
	 */
	public ConfigurableOption(String componentName, String optionName,
			Locale loc, int currentValueIndex) {

		this.componentName = componentName;
		this.optionName = optionName;
		this.currentValueIndex = currentValueIndex;

		ResourceBundle resource = null;
		try {
			String location = componentName.substring(0, componentName
					.lastIndexOf('.'));
			resource = ResourceBundle.getBundle(location + ".Options", loc); //$NON-NLS-1$
		} catch (MissingResourceException e) {
			category = "Missing ressources entries for" + componentName + " options"; //$NON-NLS-1$ //$NON-NLS-2$
			name = "Missing ressources entries for" + componentName + " options"; //$NON-NLS-1$ //$NON-NLS-2$
			description = "Missing ressources entries for" + componentName + " options"; //$NON-NLS-1$ //$NON-NLS-2$
			possibleValues = new String[0];
			id = -1;
		}
		if (resource == null)
			return;
		try {
			id = Integer.parseInt(resource.getString(optionName + ".number")); //$NON-NLS-1$
		} catch (MissingResourceException e) {
			id = -1;
		} catch (NumberFormatException e) {
			id = -1;
		}
		try {
			category = resource.getString(optionName + ".category"); //$NON-NLS-1$
		} catch (MissingResourceException e) {
			category = "Missing ressources entries for" + componentName + " options"; //$NON-NLS-1$ //$NON-NLS-2$
		}
		try {
			name = resource.getString(optionName + ".name"); //$NON-NLS-1$
		} catch (MissingResourceException e) {
			name = "Missing ressources entries for" + componentName + " options"; //$NON-NLS-1$ //$NON-NLS-2$
		}
		try {
			StringTokenizer tokenizer = new StringTokenizer(resource
					.getString(optionName + ".possibleValues"), "|"); //$NON-NLS-1$ //$NON-NLS-2$
			int numberOfValues = Integer.parseInt(tokenizer.nextToken());
			if (numberOfValues == -1) {
				possibleValues = NoDiscreteValue;
			} else {
				possibleValues = new String[numberOfValues];
				int index = 0;
				while (tokenizer.hasMoreTokens()) {
					possibleValues[index] = tokenizer.nextToken();
					index++;
				}
			}
		} catch (MissingResourceException e) {
			possibleValues = new String[0];
		} catch (NoSuchElementException e) {
			possibleValues = new String[0];
		} catch (NumberFormatException e) {
			possibleValues = new String[0];
		}
		try {
			description = resource.getString(optionName + ".description"); //$NON-NLS-1$
		} catch (MissingResourceException e) {
			description = "Missing ressources entries for" + componentName + " options"; //$NON-NLS-1$ //$NON-NLS-2$
		}
	}

	/**
	 * Return a String that represents the localized category of the receiver.
	 * 
	 * @return java.lang.String
	 */
	public String getCategory() {
		return category;
	}

	/**
	 * Return a String that identifies the component owner (typically the
	 * qualified type name of the class which it corresponds to).
	 * 
	 * e.g. "org.phpeclipse.phpdt.internal.compiler.api.Compiler"
	 * 
	 * @return java.lang.String
	 */
	public String getComponentName() {
		return componentName;
	}

	/**
	 * Answer the index (in possibleValues array) of the current setting for
	 * this particular option.
	 * 
	 * In case the set of possibleValues is NoDiscreteValue, then this index is
	 * the actual value (e.g. max line lenght set to 80).
	 * 
	 * @return int
	 */
	public int getCurrentValueIndex() {
		return currentValueIndex;
	}

	/**
	 * Answer the index (in possibleValues array) of the default setting for
	 * this particular option.
	 * 
	 * In case the set of possibleValues is NoDiscreteValue, then this index is
	 * the actual value (e.g. max line lenght set to 80).
	 * 
	 * @return int
	 */
	public int getDefaultValueIndex() {
		return defaultValueIndex;
	}

	/**
	 * Return an String that represents the localized description of the
	 * receiver.
	 * 
	 * @return java.lang.String
	 */
	public String getDescription() {
		return description;
	}

	/**
	 * Internal ID which allows the configurable component to identify this
	 * particular option.
	 * 
	 * @return int
	 */
	public int getID() {
		return id;
	}

	/**
	 * Return a String that represents the localized name of the receiver.
	 * 
	 * @return java.lang.String
	 */
	public String getName() {
		return name;
	}

	/**
	 * Return an array of String that represents the localized possible values
	 * of the receiver.
	 * 
	 * @return java.lang.String[]
	 */
	public String[] getPossibleValues() {
		return possibleValues;
	}

	/**
	 * Change the index (in possibleValues array) of the current setting for
	 * this particular option.
	 * 
	 * In case the set of possibleValues is NoDiscreteValue, then this index is
	 * the actual value (e.g. max line lenght set to 80).
	 * 
	 * @return int
	 */
	public void setValueIndex(int newIndex) {
		currentValueIndex = newIndex;
	}

	public String toString() {
		StringBuffer buffer = new StringBuffer();
		buffer.append("Configurable option for "); //$NON-NLS-1$ 
		buffer.append(this.componentName).append("\n"); //$NON-NLS-1$ 
		buffer.append("- category:			").append(this.category).append("\n"); //$NON-NLS-1$ //$NON-NLS-2$
		buffer.append("- name:				").append(this.name).append("\n"); //$NON-NLS-1$ //$NON-NLS-2$
		/* display current value */
		buffer.append("- current value:	"); //$NON-NLS-1$ 
		if (possibleValues == NoDiscreteValue) {
			buffer.append(this.currentValueIndex);
		} else {
			buffer.append(this.possibleValues[this.currentValueIndex]);
		}
		buffer.append("\n"); //$NON-NLS-1$ 

		/* display possible values */
		if (possibleValues != NoDiscreteValue) {
			buffer.append("- possible values:	["); //$NON-NLS-1$ 
			for (int i = 0, max = possibleValues.length; i < max; i++) {
				if (i != 0)
					buffer.append(", "); //$NON-NLS-1$ 
				buffer.append(possibleValues[i]);
			}
			buffer.append("]\n"); //$NON-NLS-1$ 
			buffer
					.append("- curr. val. index:	").append(currentValueIndex).append("\n"); //$NON-NLS-1$ //$NON-NLS-2$
		}
		buffer.append("- description:		").append(description).append("\n"); //$NON-NLS-1$ //$NON-NLS-2$
		return buffer.toString();
	}

	/**
	 * Gets the optionName.
	 * 
	 * @return Returns a String
	 */
	public String getOptionName() {
		return optionName;
	}
}
