//------------------------------------------------------------------------------
// 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.authoring.ui.preferences;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
import org.eclipse.epf.authoring.ui.AuthoringUIResources;
import org.eclipse.epf.common.utils.StrUtil;
import org.eclipse.epf.library.edit.util.TngUtil;
import org.eclipse.jface.preference.IPreferenceStore;

/**
 * Manages the Authoring UI preferences.
 * 
 * @author Kelvin Low
 * @since 1.2
 */
public class AuthoringUIPreferences {

	public static final String ENABLE_LIBRARY_VALIDATION = "enabledLibraryValidation"; //$NON-NLS-1$
	
	public static final String ENABLE_UI_FIELDS = "enableUIFields"; //$NON-NLS-1$
	
	public static final String ENABLE_AUTO_NAME_GEN = "autoNameGen"; //$NON-NLS-1$
	
	public static final String RTE_URL_DECODING_OPTION = "rteUrlDecodingOption"; //$NON-NLS-1$
	
	public static final String RTE_URL_DECODING_HEX_NUMBERS = "rteUrlDecodingHexNumbers"; //$NON-NLS-1$

	public static final String ADD_TASKS_PER_ROW = "ACTIVITY_DETAIL_DIAGRAM_TASKS_PER_ROW"; //$NON-NLS-1$
	
	private static final int DEFAULT_ADD_TASKS_PER_ROW = 10; 
	
	private static final boolean DEFAULT_ENABLE_LIBRARY_VALIDATION = false;
	
	private static final boolean DEFAULT_ENABLE_UI_FIELDS = false;
	
	private static final boolean DEFAULT_ENABLE_AUTO_NAME_GEN = false;

	private static final int DEFAULT_RTE_URL_DECODING_OPTION = 2;
	
	private static final String DEFAULT_RTE_URL_DECODING_HEX_NUMBERS = "%" + AuthoringUIResources.hex_20;	//$NON-NLS-1$ 
	
	// The plug-in specific preference store.
	private static IPreferenceStore prefStore = AuthoringUIPlugin.getDefault()
			.getPreferenceStore();
	
	private static boolean toClearStrUtilOptionsCache = false;
	
	static {
		// Initialize the default preference values.
		prefStore.setDefault(ENABLE_LIBRARY_VALIDATION,
				DEFAULT_ENABLE_LIBRARY_VALIDATION);
		
		prefStore.setDefault(ENABLE_UI_FIELDS,
				DEFAULT_ENABLE_UI_FIELDS);
		
		prefStore.setDefault(ENABLE_AUTO_NAME_GEN,
				DEFAULT_ENABLE_AUTO_NAME_GEN);
		
		prefStore.setDefault(ADD_TASKS_PER_ROW, DEFAULT_ADD_TASKS_PER_ROW);
		
		prefStore.setDefault(RTE_URL_DECODING_OPTION, DEFAULT_RTE_URL_DECODING_OPTION);
		
		prefStore.setDefault(RTE_URL_DECODING_HEX_NUMBERS, DEFAULT_RTE_URL_DECODING_HEX_NUMBERS);
		
		StrUtil.StrUtilOptions strUtilOptions = new StrUtil.StrUtilOptions() {
			private Map<String, String> cachedMap;
			public int getRteUrlDecodingOption() {
				return AuthoringUIPreferences.getRteUrlDecodingOption();
			}
			public Map<String, String> getRteUrlDecodingHexMap() {
				if (cachedMap == null || toClearStrUtilOptionsCache) {
					toClearStrUtilOptionsCache = false;
					cachedMap =  AuthoringUIPreferences.getRteUrlDecodingHexMap();
				}
				return cachedMap;
			}
		};
		
		StrUtil.setOptions(strUtilOptions);
	}

	/**
	 * Gets the default enable method library validation preference.
	 */
	public static boolean getDefaultEnableLibraryValidation() {
		return DEFAULT_ENABLE_LIBRARY_VALIDATION;
	}

	/**
	 * Gets the method library validation preference.
	 */
	public static boolean getEnableLibraryValidation() {
		return prefStore.getBoolean(ENABLE_LIBRARY_VALIDATION);
	}

	/**
	 * Sets the method library validation preference.
	 */
	public static void setEnableLibraryValidation(boolean value) {
		prefStore.setValue(ENABLE_LIBRARY_VALIDATION, value);
	}
	
	/**
	 * Gets the default enable UI fields preference (long presentation name, external ID)
	 */
	public static boolean getDefaultEnableUIFields() {
		return DEFAULT_ENABLE_UI_FIELDS;
	}
	
	/**
	 * Gets the enable UI fields preference (long presentation name, external ID)
	 */
	public static boolean getEnableUIFields() {
		return prefStore.getBoolean(ENABLE_UI_FIELDS);
	}

	/**
	 * Sets the enable UI fields preference (long presentation name, external ID)
	 */
	public static void setEnableUIFields(boolean value) {
		prefStore.setValue(ENABLE_UI_FIELDS, value);
	}
	
	/**
	 * Gets the default enable auto name gen fields preference 
	 */
	public static boolean getDefaultEnableAutoNameGen() {
		return DEFAULT_ENABLE_AUTO_NAME_GEN;
	}
	
	/**
	 * Gets the enable enable auto name gen preference 
	 */
	public static boolean getEnableAutoNameGen() {
		return prefStore.getBoolean(ENABLE_AUTO_NAME_GEN);
	}

	/**
	 * Sets the enable enable auto name gen preference 
	 */
	public static void setEnableAutoNameGen(boolean value) {
		prefStore.setValue(ENABLE_AUTO_NAME_GEN, value);
	}

	/**
	 * Gets the default rte url decoding option
	 */
	public static int getDefaultRteUrlDecodingOption() {
		return DEFAULT_RTE_URL_DECODING_OPTION;
	}
	
	/**
	 * Gets the rte url decoding option
	 */
	public static int getRteUrlDecodingOption() {
		return prefStore.getInt(RTE_URL_DECODING_OPTION);
	}

	/**
	 * Sets the rte url decoding option
	 */
	public static void setgetRteUrlDecodingOption(int value) {
		prefStore.setValue(RTE_URL_DECODING_OPTION, value);
	}
	
	
	/**
	 * Gets the default rte url decoding hex numbers
	 */
	public static String getDefaultRteUrlDecodingHexNumbers() {
		return DEFAULT_RTE_URL_DECODING_HEX_NUMBERS;
	}
	
	/**
	 * Gets the rte url decoding hex numbers
	 */
	public static String getRteUrlDecodingHexNumbers() {
		return prefStore.getString(RTE_URL_DECODING_HEX_NUMBERS);
	}

	/**
	 * Sets the rte url decoding hex numbers
	 */
	public static void setRteUrlDecodingHexNumbers(String value) {
		toClearStrUtilOptionsCache = true;
		prefStore.setValue(RTE_URL_DECODING_HEX_NUMBERS, value);
	}
	
	/**
	 * Gets the rte url decoding hex number set
	 */
	public static Map<String, String> getRteUrlDecodingHexMap() {
		Map<String, String> map = new HashMap<String, String>();
		String str = getRteUrlDecodingHexNumbers();		
		List<String> strValues = TngUtil.convertStringsToList(str, "\n");//$NON-NLS-1$
		for (String strValue : strValues) {
			String key = StrUtil.getHexStr(strValue);
			if (key != null) {
				map.put(key, strValue);
			}
		}		
		return map;
	}
	
	/**
	 * Gets the ADD_TASKS_PER_ROW preference.
	 */
	public static int getADD_TasksPerRow()  {
		int value = prefStore.getInt(ADD_TASKS_PER_ROW);
		return value > 0 ? value : DEFAULT_ADD_TASKS_PER_ROW;
	}

	/**
	 * Sets the ADD_TASKS_PER_ROW preference.
	 */
	public static void setADDTasksPerRow(int value) {
		prefStore.setValue(ADD_TASKS_PER_ROW, value);
	}
	
	/**
	 * Gets the default ADD_TASKS_PER_ROW preference.
	 */
	public static int getDefaultADDTasksPerRow() {
		return DEFAULT_ADD_TASKS_PER_ROW;
	}

}
