//------------------------------------------------------------------------------
// Copyright (c) 2005, 2007 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.common.utils;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.eclipse.jface.preference.IPreferenceStore;

import com.ibm.icu.util.StringTokenizer;

/**
 * Utility class for accessing preferences.
 * 
 * @author Kelvin Low
 * @since 1.2
 */
public class PreferenceUtil {

	// The multi-string preference delimiter.
	private static final String PREFERENCE_DELIMITER = ";"; //$NON-NLS-1$

	// private static final Object[] EMPTY_LIST = new Object[0];

	/**
	 * Gets a list containing string values associated with a named preference.
	 * 
	 * @param prefStore
	 *            a preference store
	 * @param name
	 *            the preference name
	 * @return a list of string values
	 */
	public static List getList(IPreferenceStore prefStore, String name) {
		List values = new ArrayList();
		if (prefStore != null && name != null) {
			String value = prefStore.getString(name);
			StringTokenizer tokenizer = new StringTokenizer(value,
					PREFERENCE_DELIMITER);
			int tokenCount = tokenizer.countTokens();
			for (int i = 0; i < tokenCount; i++) {
				values.add(tokenizer.nextToken());
			}
		}
		return values;
	}

	/**
	 * Gets the string values associated with a named preference.
	 * 
	 * @param prefStore
	 *            a preference store
	 * @param name
	 *            the preference name
	 * @return a list of string preference values
	 */
	public static String[] getStringValues(IPreferenceStore prefStore,
			String name) {
		List list = getList(prefStore, name);
		String[] values = new String[list.size()];
		list.toArray(values);
		return values;
	}

	/**
	 * Saves a list containing string values associated with a named preference.
	 * 
	 * @param prefStore
	 *            a preference store
	 * @param name
	 *            the preference name
	 * @param values
	 *            a list of string values
	 */
	public static void setList(IPreferenceStore prefStore, String name,
			List values) {
		if (prefStore != null && name != null && values != null) {
			StringBuffer buffer = new StringBuffer();
			for (Iterator it = values.iterator(); it.hasNext();) {
				String value = (String) it.next();
				buffer.append(value);
				buffer.append(PREFERENCE_DELIMITER);
			}
			prefStore.setValue(name, buffer.toString());
		}
	}

	/**
	 * Adds a string value to a list containing string values associated with a
	 * named preference.
	 * 
	 * @param prefStore
	 *            a preference store
	 * @param name
	 *            the preference name
	 * @param value
	 *            a string value
	 */
	public static void addToList(IPreferenceStore prefStore, String name,
			String value) {
		if (prefStore != null && name != null && value != null) {
			List list = getList(prefStore, name);
			list.remove(value);
			list.add(0, value);
			// FIXME! Read from global preference.
			if (list.size() > 10) {
				list = list.subList(0, 10);
			}
			setList(prefStore, name, list);
		}
	}

	/**
	 * Saves an array of string values associated with a named preference.
	 * 
	 * @param prefStore
	 *            a preference store
	 * @param name
	 *            the preference name
	 * @param values
	 *            an array of string values
	 */
	public static void setStringValues(IPreferenceStore prefStore, String name,
			String[] values) {
		if (prefStore != null && name != null && values != null) {
			StringBuffer buffer = new StringBuffer();
			for (int i = 0; i < values.length; i++) {
				buffer.append(values[i]);
				buffer.append(PREFERENCE_DELIMITER);
			}
			prefStore.setValue(name, buffer.toString());
		}
	}

}
